什么是扩展方法?为什么我们需要使用它?

时间:2010-07-21 09:08:33

标签: .net asp.net c#-3.0

  

可能重复:
  What are Extension Methods?

您好,
googlin了解了一些扩展方法,但不是很清楚为什么我们需要使用扩展方法,它是如何工作的?

请建议。

谢谢,
Subhen

5 个答案:

答案 0 :(得分:1)

  

什么是扩展方法?

请参阅此问题 - What are Extension Methods?

  

为什么我们需要使用它?

Somehow, I don't agree to the idea of using extension methods to extend an existing type since practically this is impossible.您想要使用扩展方法的唯一原因是为任何类型提供fluency and readabilty

检查此代码..

string str = "Hello world";
string result = Helper.Method2(Helper.Method1(str));

此扩展方法的代码可以写成如下。

string str = "Hello world";
string result = str.Method1().Method2();
//compiler ultimately compiles this code as Helper.Method2(Helper.Method1(str));

哪一个更流畅可读?具有扩展方法的那个。

答案 1 :(得分:0)

如果您需要向第三方.dll或某些您无法直接访问源代码的组件添加功能,则扩展方法非常有用。

因此,例如,您没有直接访问权限来修改String类,但使用扩展方法可以向其添加方法。 (或给该类用户留下这种印象)

答案 2 :(得分:0)

扩展方法允许您向现有类型添加方法,而无需创建派生类。当您无法访问框架等代码时,它也很有用。更多信息here

答案 3 :(得分:0)

扩展方法只是增加了一点“语法糖”,使编写代码变得更容易。

例如,IEnumerable<T>接口上有很多扩展方法。其中一些是在名为EnumerableExtensions的静态类中定义的,可能是这样的:

public static class EnumerableExtensions
{
    public static IEnumerable<T> Where<T>(this IEnumerable<T> items, Expression<Func<T, bool>> predicate)
    {
        // Filter based on the predicate and return the matching elements
    }
}

请注意,类和方法都标记为static,并且第一个参数前面有this个关键字。 this将此方法标记为扩展方法。

现在,要在IEnumerable<T>的实例上使用此方法,比如说myTees,只需输入

即可
var filtered = myTees.Where(t => t.IsCool);

但这不是实际编译成.dll的代码。编译器将此调用替换为扩展方法,并调用

var filtered = EnumerableExtensions.Where(myTees, t => t.IsCool);

正如您所见,它只是另一个类上的常规静态方法。

因此,扩展方法的一个主要方面是使静态方法的使用更加顺畅,从而产生更易读的代码。

当然,这也会产生这样的效果:您可以在.NET框架中扩展任何类型 - 甚至(尤其是)您自己没有创建的类型!它就像编写一个常规的静态方法一样简单,该方法将您想要扩展的类型作为第一个参数,在其前面添加this并标记包含的类static。供应苹果派! =)

答案 4 :(得分:0)

它们允许您使用新方法扩展所有已有的类。不改变他们的代码,或者Dll。

好处是,它们是有意使用的。

例如:假设您经常需要在项目中剪切字符串,直到找到特定的字符串。

通常你会写这样的代码:

input.Substring(0,input.LastIndexOf(tofind))

这有问题,如果找不到字符串,则会出现异常。和开发人员都很懒。因此,如果他们认为,这不会发生,他们只是不抓住它或重构所有的遮挡物。所以,你可以在某个地方制作一个方法。

public static class StringExtensions
        {

            public static string SubstringTill(string input, string till, StringComparison comparisonType = StringComparison.CurrentCulture)
            {
                int occourance = input.LastIndexOf(till, comparisonType);

                if (occourance < 0)
                    return input;

                return input.Substring(0, occourance);
            }
        }

和...然后是困难的部分。向所有开发人员发送电子邮件,现在已经存在,并且他们将来应该使用它。并将其放入新开发人员的文档中......或者:

只需在

方法中添加“this”即可
public static string SubstringTill(this string input, string till, StringComparison comparisonType = StringComparison.CurrentCulture)

你得到一个扩展方法。当任何人编写代码并且需要这样的代码时,他会看到呃,已经有人做了这样做的方法。所以可重用性和DRY更容易实现。如果它正确记录了它的作用,以及可能出现的例外情况。