And*_*ech 57
扩展方法允许开发人员向现有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);
}
Run Code Online (Sandbox Code Playgroud)
现在,可以直接从任何字符串调用上述方法,如:
bool isValid = "so@mmas.com".IsValidEmailAddress();
Run Code Online (Sandbox Code Playgroud)
添加的方法也会出现在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;
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,该类Extending正在向class 添加名为average的方法Extended.要获得平均值,请调用average方法,因为它属于extended类:
Extended ex = new Extended();
Console.WriteLine(ex.average());
Run Code Online (Sandbox Code Playgroud)
参考:http://aspguy.wordpress.com/2008/07/03/a-practical-use-of-serialization-and-extension-methods-in-c-30/
BKS*_*eon 11
假设我有一只狗.所有的狗 - 所有类型的狗的动物 - 做某些事情:
狗可以做的事情都被称为"方法".
现在让我们假设OO Heaven中的伟大程序员忘记为dog类添加一个方法:FetchNewspaper().你希望能够说:
rex.FetchNewspaper(); // or
wolfie.FetchNewspaper(); // or
beethoven.FetchNewspaper();
Run Code Online (Sandbox Code Playgroud)
......即使您无法访问源代码.
你是如何让你的狗这样做的?您唯一的解决方案是创建"扩展方法".
(注意下面第一个参数前面的"this"关键字):
public static void FetchNewsPaper(this Dog familyDog)
{
Console.Writeline(“Goes to get newspaper!”)
}
Run Code Online (Sandbox Code Playgroud)
如果你想让你的狗得到报纸,只需这样做:
Dog freddie_the_family_dog = new Dog();
freddie_the_family_dog.FetchNewspaper();
Run Code Online (Sandbox Code Playgroud)
您可以在没有源代码的情况下将方法添加到类中.这非常方便!
以上答案太复杂了.我猜你如果需要问一下扩展方法是什么,你就不会真正知道它是什么意思:(i)公共合同,(ii)CLR,(iii)类型,(iv)子类,( v)鸭子打字等
扩展方法是开发人员将方法"添加"到无法控制的对象的方法.
例如,如果要向System.Windows.Forms对象添加"DoSomething()"方法,由于您无权访问该代码,因此只需使用以下语法为表单创建扩展方法即可.
Public Module MyExtensions
<System.Runtime.CompilerServices.Extension()> _
Public Sub DoSomething(ByVal source As System.Windows.Forms.Form)
'Do Something
End Sub
End Module
Run Code Online (Sandbox Code Playgroud)
现在,您可以在表单中调用"Me.DoSomething()".
总之,它是一种在没有继承的情况下向现有对象添加功能的方法.
扩展方法是一种“编译器技巧”,即使您没有该方法的源代码,它也可以模拟将方法添加到另一个类中。
例如:
using System.Collections;
public static class TypeExtensions
{
/// <summary>
/// Gets a value that indicates whether or not the collection is empty.
/// </summary>
public static bool IsEmpty(this CollectionBase item)
{
return item.Count == 0;
}
}
Run Code Online (Sandbox Code Playgroud)
从理论上讲,所有集合类现在都包含一个IsEmpty方法,如果该方法没有任何项目,则该方法返回true(前提是您已包含定义上述类的名称空间)。
如果我错过了任何重要的事情,我相信有人会指出。(请!)
自然,存在有关扩展方法声明的规则(它们必须是静态的,第一个参数必须以this关键字开头,依此类推)。
扩展方法实际上并不修改它们似乎在扩展的类;而是,编译器会处理函数调用以在运行时正确地调用该方法。但是,扩展方法正确显示在具有独特图标的智能感知下拉列表中,并且您可以像记录普通方法一样记录它们(如上所示)。
注意:如果方法已经存在且具有相同签名,则扩展方法永远不会替换该方法。
| 归档时间: |
|
| 查看次数: |
7094 次 |
| 最近记录: |