日期:2014-05-18  浏览次数:20679 次

[讨论]关于.NET3.5中新增的扩展方法功能
以下是.NET3.5中提供的扩展方法MSDN上简单示例:
C# code

using System;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "Hello Extension Methods";
            int i = s.WordCount();

            Console.WriteLine(i.ToString());
            Console.ReadKey();
        }
    }

    public static class MyExtensions
    {
        public static int WordCount(this String str)
        {
            return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
        }
    } 
}




扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。

通用准则
通常,建议您只在不得已的情况下才实现扩展方法,并谨慎地实现。只要有可能,必须扩展现有类型的客户端代码都应该通过创建从现有类型派生的新类型来达到这一目的。有关更多信息,请参见继承(C# 编程指南)。

在使用扩展方法来扩展您无法更改其源代码的类型时,您需要承受该类型实现中的更改会导致扩展方法失效的风险。

如果您确实为给定类型实现了扩展方法,请记住以下两点:

如果扩展方法与该类型中定义的方法具有相同的签名,则扩展方法永远不会被调用。

扩展方法被在命名空间级别放入范围中。例如,如果您在同一个名为 Extensions 的命名空间中具有多个包含扩展方法的静态类,则这些扩展方法将全部由 using Extensions; 指令放入范围中。

类库的实施者不应使用扩展方法来避免创建程序集的新版本。如果您要向库中添加重要的新功能,并且您拥有源代码,则应该遵循标准 .NET Framework 程序集版本控制准则。有关更多信息,请参见程序集版本控制。



试了试,确实方便!
大家不常提到这个话题,所以上来与大家讨论讨论.

请谈谈关于扩展方法的利弊,有那位朋友在项目中已经用到此种功能?

------解决方案--------------------
有用到啊,随便贴一段吧

 /// <summary>
/// 检查参数(防止网页上使用SQL注入式攻击,使用字符检查)
/// </summary>
/// <param name="objArgs">要检查的对象数组</param>
/// <returns>布尔值: true为匹配 | false为未找到</returns>
public static bool StringCheck(this string objArgs)
{
#region 检查参数
string[] ruleArray = { "'", "\"", "%", ":", "=", "/", "<", ">", "NET USER", "XP_CMDSHELL", "ADD", "EXEC MASTER.DBO.XP_CMDSHELL", "NET LOCALGROUP ADMINISTRATORS", "SELECT", "COUNT", "ASC", "CHAR", "MID", "INSERT", "DELETE FROM", "DROP TABLE", "UPDATE", "TRUNCATE", "FROM" };
return StringCheck(ruleArray, objArgs);
#endregion
}
------解决方案--------------------
看过兰州的示例,这扩展方法还蛮方便的
------解决方案--------------------
有些用的,比如你对某个对象(系统内置)有特殊的要求,又不能更改系统本身的,只有这个东东能够解决问题,写方法没这个方便啊。。。
------解决方案--------------------
我感觉很有用的。
但是我没用过
------解决方案--------------------
很神奇
------解决方案--------------------
感觉参数列表中的this关键字挺有用的,我是说在多线程里。下去写个小程序测试一下去。
------解决方案--------------------

学习了。
------解决方案--------------------
扩展方法是一种快捷地扩展已有类型的方法定义和实现的机制
扩展方法必须声明在静态类中;
扩展方法只能针对实例调用;
如果考虑性能可以使用扩展方法
------解决方案--------------------
没看到过这个,学习
------解决方案--------------------
很不错的一个新功能.
------解决方案--------------------
如果你曾添加过“using System.Linq;”这样的命名空间引用,那么你就已经用过微软提供的扩展方法了。
Linq的方法都是通过扩展方法的方式嵌入到原有的2.0的类当中的,所以你会发现就算是3.5的项目,核心部分的类还是基于2.0的,微软并没有重写那些类,只不过用了扩展方法这个技巧在运行时对类进行了补充。