扩展方法有什么好处?

Dan*_*Tao 4 .net c# extension-methods static-methods

可能重复:
您找到了扩展方法的哪些优点?

好吧,首先,我意识到这听起来有争议,但我并不是说是对抗性的.出于好奇心(或许拼图是一个更好的词),我问一个严肃的问题.

为什么扩展方法引入.NET?它们提供了什么好处,除了让事情看起来很好(并且"好",我的意思是"看似像实例方法")?

对我来说,使用像这样的扩展方法的任何代码:

Thing initial = GetThing();
Thing manipulated = initial.SomeExtensionMethod();
Run Code Online (Sandbox Code Playgroud)

是误导,因为它暗示这SomeExtensionMethod是一个实例成员Thing,误导开发人员相信(至少作为一种直觉......你可能会否认它,但我肯定已经注意到这一点)(1)SomeExtensionMethod可能是有效实施的, (2)因为SomeExtensionMethod实际上它看起来像是课堂的一部分,Thing如果Thing在未来的某个时候进行修改,它肯定会保持有效(只要作者Thing知道他/她在做什么).

但事实是,扩展方法无法访问受保护的成员或他们正在扩展的类的任何内部工作,因此它们与任何其他静态方法一样容易破坏.

我们都知道以上很容易:

Thing initial = GetThing();
Thing manipulated = SomeNonExtensionMethod(initial);
Run Code Online (Sandbox Code Playgroud)

我来说,这似乎更多,因为缺乏一个更好的词,诚实.

我错过了什么?为什么存在扩展方法?

Mar*_*ers 14

需要使用扩展方法来使Linq以干净的方式工作,并使用方法链接.如果必须使用"long"形式,则会导致函数调用和参数彼此分离,从而使代码难以阅读.相比:

IEnumerable<int> r = list.Where(x => x > 10).Take(5)
Run Code Online (Sandbox Code Playgroud)

// What does the 5 do here?
IEnumerable<int> r = Enumerable.Take(Enumerable.Where(list, x => x > 10), 5);
Run Code Online (Sandbox Code Playgroud)

像任何东西一样,它们可能被滥用,但扩展方法在正确使用时非常有用.


Fre*_*örk 6

我认为主要的好处是可发现性.输入initial和点,你可以用它做所有的事情.在其他地方的某个类中找到隐藏的静态方法要困难得多.