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

您找到了扩展方法的哪些优点?

如何解决《您找到了扩展方法的哪些优点?》经验,为你挑选了8个好方法。

C#的"非信徒"问我扩展方法的目的是什么.我解释说,然后您可以向已定义的对象添加新方法,尤其是当您不拥有/控制原始对象的源时.

他提出"为什么不在自己的课堂上添加一种方法?" 我们一直在四处走动(以一种很好的方式).我的一般回答是,它是工具带中的另一个工具,他的回答是它是一种无用的工具浪费......但我认为我会得到一个更"开明"的答案.

有哪些场景你使用了你不能(或不应该)使用的方法添加到你自己的类上的扩展方法?



1> Andrew Hare..:

扩展方法的唯一优点是代码可读性.而已.

扩展方法允许您这样做:

foo.bar();

而不是这个:

Util.bar(foo);

现在C#中有很多东西都是这样的.换句话说,C#中有许多功能似乎微不足道,并且本身并没有很大的好处.然而,一旦开始将这些功能组合在一起,您就会开始看到比其各部分总和更大的东西.LINQ从扩展方法中获益很大,因为如果没有它们,LINQ查询几乎是不可读的.LINQ可以在没有扩展方法的情况下实现,但不实用.

扩展方法很像C#的部分类.他们自己并不是很有帮助,而且似乎微不足道.但是当你开始使用需要生成代码的类时,部分类开始变得更有意义.


98%的语言结构的唯一优点是代码可读性.通过分支操作符,标签,转到和增量的任何东西都可以让您的生活更轻松.
右击VS IDE中的bar()并选择转到定义将带您到正确的位置.
我没有得到的是foo.bar()向我建议bar()是一种foo方法.因此,当它不起作用时,我最终会找错了地方.我不确定这对我来说实际上是一种可读性改进.
这并非完全正确,在某些情况下,扩展方法是扩展类的唯一方法.除了密封课程,我在非常独特的情况下使用它们.请参阅下面的帖子.

2> Brian..:

不要忘记工具!当你在Foo类型上添加扩展方法M时,你会在Foo的intellisense列表中得到'M'(假设扩展类在范围内).这使得'M'比MyClass.M(Foo,...)更容易找到.

在一天结束时,它只是其他静态方法的语法糖,但就像买房子一样:"位置,位置,位置!" 如果它挂在类型上,人们会发现它!


对此还有一点点负面影响:扩展方法(例如来自System.Linq的扩展方法填充了具有更长列表的IntelliSense自动完成功能,使其更难以导航.

3> Eduardo Camp..:

我认为扩展方法在编写代码时有很多帮助,如果你将扩展方法添加到基本类型中,你会在intellisense中快速获得它们.

我有一个格式提供程序来格式化文件大小.要使用它,我需要写:

Console.WriteLine(String.Format(new FileSizeFormatProvider(), "{0:fs}", fileSize));

创建扩展方法我可以写:

Console.WriteLine(fileSize.ToFileSize());

更清洁,更简单.


但是,这并不是直接回答问题,因为您提供的示例不需要是扩展方法.你可以拥有`LongToFileSize(fileSize)`,这同样简洁明了.
扩展方法的更具描述性的名称将使其更加清晰.例如fileSize.ToFormattedString();
尽管如此.当我读取fileSize.ToFileSize()时,我问为什么重复?它到底在做什么?我知道这只是一个例子,但描述性名称有助于使其简洁明了.

4> David Alpert..:

我遇到的扩展方法还有两个好处:

一个流畅的接口可以封装在一个静态的扩展方法类中,从而实现核心类和它的流畅扩展之间的关注点分离; 我已经看到了实现更高的可维护性

扩展方法可以挂起接口,从而允许您指定合同(通过接口)和相关的一系列基于接口的行为(通过扩展方法),再次提供关注点分离.



5> Jon Limjap..:

我对扩展方法的一些最佳用途是能够:

    扩展第三方对象(无论是商业的还是我公司内部的,但由一个单独的组管理)的功能,在许多情况下将被标记为sealed.

    为接口创建默认功能,而无需实现抽象类

举个例子,IEnumerable.虽然它有丰富的扩展方法,但我发现它没有实现通用的ForEach方法很烦人.所以,我自己做了:

public void ForEach(this IEnumerable enumerable, Action action)
{
    foreach ( var o in enumerable )
    {
        action(o);
    }
}

瞧,IEnumerable无论实现类型如何,我的所有对象,以及我是否编写它或其他人现在都ForEach通过在我的代码中添加适当的"using"语句来实现方法.


请注意,该方法需要是静态的.我建议在决定使用此扩展程序之前阅读http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx.
+1我喜欢这个扩展,我写了一个就像它.非常有用

6> Ray Booysen..:

使用扩展方法的一个重要原因是LINQ.没有扩展方法,你在LINQ中可以做的很多事情都会非常困难.Where(),Contains(),Select扩展方法意味着在不改变其结构的情况下将更多功能添加到现有类型.


它不是'其中之一',它是推广方法的原因.
怎么会这样?这是扩展方法的众多原因之一,而不是唯一的要求.我可以在不使用LINQ的情况下使用扩展方法.

7> Ryan Lundy..:

关于扩展方法的优点有很多答案; 如何解决这些弊端

最大的缺点是,如果在同一个上下文中有常规方法和具有相同签名的扩展方法,则不会出现编译器错误或警告.

假设您创建了一个应用于特定类的扩展方法.然后有人在该类本身创建一个具有相同签名的方法.

您的代码将编译,您甚至可能不会收到运行时错误. 但是你不再像以前那样运行相同的代码了.



8> cgreeno..:

Greg Young在CodeBetter上展示了流畅的界面和上下文敏感性

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