.NET中的扩展方法是什么?
编辑:我在使用扩展方法时发布了一个跟进问题
扩展方法允许开发人员向现有CLR类型的公共协定添加新方法,而无需对其进行子类化或重新编译原始类型.
扩展方法有助于将当今动态语言中流行的"duck typing"支持的灵活性与强类型语言的性能和编译时验证相结合.
参考:http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx
以下是扩展方法的示例(请注意this
第一个参数的关键字infront):
public static bool IsValidEmailAddress(this string s) { Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$"); return regex.IsMatch(s); }
现在,可以直接从任何字符串调用上述方法,如:
bool isValid = "so@mmas.com".IsValidEmailAddress();
添加的方法也会出现在IntelliSense中:
(来源:scottgu.com)
关于扩展方法的实际用法,您可以在不派生新类的情况下向类添加新方法.
看一下下面的例子:
public class Extended { public int Sum() { return 7+3+2; } } public static class Extending { public static float Average(this Extended extnd) { return extnd.Sum() / 3; } }
如您所见,该类Extending
正在向class 添加名为average的方法Extended
.要获得平均值,请调用average
方法,因为它属于extended
类:
Extended ex = new Extended(); Console.WriteLine(ex.average());
参考:http://aspguy.wordpress.com/2008/07/03/a-practical-use-of-serialization-and-extension-methods-in-c-30/
假设我有一只狗.所有的狗 - 所有类型的狗的动物 - 做某些事情:
吃
WagsTail
喊"Woof!"
摇爪等
狗可以做的事情都被称为"方法".
现在让我们假设OO Heaven中的伟大程序员忘记为dog类添加一个方法:FetchNewspaper().你希望能够说:
rex.FetchNewspaper(); // or wolfie.FetchNewspaper(); // or beethoven.FetchNewspaper();
......即使您无法访问源代码.
你是如何让你的狗这样做的?您唯一的解决方案是创建"扩展方法".
(注意下面第一个参数前面的"this"关键字):
public static void FetchNewsPaper(this Dog familyDog) { Console.Writeline(“Goes to get newspaper!”) }
如果你想让你的狗得到报纸,只需这样做:
Dog freddie_the_family_dog = new Dog(); freddie_the_family_dog.FetchNewspaper();
您可以在没有源代码的情况下将方法添加到类中.这非常方便!
以上答案太复杂了.我猜你如果需要问一下扩展方法是什么,你就不会真正知道它是什么意思:(i)公共合同,(ii)CLR,(iii)类型,(iv)子类,( v)鸭子打字等
扩展方法是开发人员将方法"添加"到无法控制的对象的方法.
例如,如果要向System.Windows.Forms对象添加"DoSomething()"方法,由于您无权访问该代码,因此只需使用以下语法为表单创建扩展方法即可.
Public Module MyExtensions_ Public Sub DoSomething(ByVal source As System.Windows.Forms.Form) 'Do Something End Sub End Module
现在,您可以在表单中调用"Me.DoSomething()".
总之,它是一种在没有继承的情况下向现有对象添加功能的方法.
扩展方法是一种“编译器技巧”,即使您没有该方法的源代码,它也可以模拟将方法添加到另一个类中。
例如:
using System.Collections; public static class TypeExtensions { ////// Gets a value that indicates whether or not the collection is empty. /// public static bool IsEmpty(this CollectionBase item) { return item.Count == 0; } }
从理论上讲,所有集合类现在都包含一个IsEmpty
方法,如果该方法没有任何项目,则该方法返回true(前提是您已包含定义上述类的名称空间)。
如果我错过了任何重要的事情,我相信有人会指出。(请!)
自然,存在有关扩展方法声明的规则(它们必须是静态的,第一个参数必须以this
关键字开头,依此类推)。
扩展方法实际上并不修改它们似乎在扩展的类;而是,编译器会处理函数调用以在运行时正确地调用该方法。但是,扩展方法正确显示在具有独特图标的智能感知下拉列表中,并且您可以像记录普通方法一样记录它们(如上所示)。
注意:如果方法已经存在且具有相同签名,则扩展方法永远不会替换该方法。