当前位置:  开发笔记 > 编程语言 > 正文

什么是扩展方法?

如何解决《什么是扩展方法?》经验,为你挑选了4个好方法。

.NET中的扩展方法是什么?



编辑:我在使用扩展方法时发布了一个跟进问题



1> Andreas Grec..:

扩展方法允许开发人员向现有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/


100%正确,虽然我有一个很强的添加扩展方法的原始类型,如字符串,不是该类型的基础.因此,我不会将'IsValidEmailAddress'添加到字符串中,但我添加了Left(int)和Right(int).

2> BKSpurgeon..:

扩展方法 - 简单解释

假设我有一只狗.所有的狗 - 所有类型的狗的动物 - 做某些事情:

    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)鸭子打字等



3> Tom Anderson..:

扩展方法是开发人员将方法"添加"到无法控制的对象的方法.

例如,如果要向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()".

总之,它是一种在没有继承的情况下向现有对象添加功能的方法.



4> Mike Hofer..:

扩展方法是一种“编译器技巧”,即使您没有该方法的源代码,它也可以模拟将方法添加到另一个类中。

例如:

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关键字开头,依此类推)。

扩展方法实际上并不修改它们似乎在扩展的类;而是,编译器会处理函数调用以在运行时正确地调用该方法。但是,扩展方法正确显示在具有独特图标的智能感知下拉列表中,并且您可以像记录普通方法一样记录它们(如上所示)。

注意:如果方法已经存在且具有相同签名,则扩展方法永远不会替换该方法。

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有