好吧,首先,我意识到这听起来有争议,但我并不是说是对抗性的。我怀疑是真正的好奇心(或者拼图是一个更好的词)。
为什么扩展方法会引入.NET?他们提供了什么好处,除了让事情看起来不错(并且“好”,我的意思是“看似像实例方法一样”)?
对我来说,任何使用扩展方法的代码都是这样的:
Thing initial = GetThing();
Thing manipulated = initial.SomeExtensionMethod();
具有误导性,因为它暗示SomeExtensionMethod
是Thing
的实例成员,误导开发人员相信(至少作为一种直觉......你可能否认它但我绝对是观察到这一点)(1)SomeExtensionMethod
可能是有效实现的,(2)因为SomeExtensionMethod
实际上看起来像Thing
类的部分,当然它如果Thing
在未来的某个时间点进行修订(只要Thing
的作者知道他/她正在做什么),它将保持有效。
但事实是,扩展方法无法访问受保护的成员或他们正在扩展的类的任何内部工作,因此它们就像任何其他静态方法一样容易破坏。
我们都知道上述内容很容易:
Thing initial = GetThing();
Thing manipulated = SomeNonExtensionMethod(initial);
me ,这似乎更多,因为缺乏更好的词,诚实。
我错过了什么?为什么存在扩展方法?
答案 0 :(得分:14)
需要使用扩展方法,通过方法链接使Linq以干净的方式工作。如果必须使用“long”形式,则会导致函数调用和参数彼此分离,从而使代码难以阅读。比较:
IEnumerable<int> r = list.Where(x => x > 10).Take(5)
与
// What does the 5 do here?
IEnumerable<int> r = Enumerable.Take(Enumerable.Where(list, x => x > 10), 5);
与任何东西一样,它们可能被滥用,但如果使用得当,扩展方法确实非常有用。
答案 1 :(得分:6)
我认为主要的好处是可发现性。键入initial
和一个点,您可以使用它完成所有内容。在其他地方找到隐藏在某个类中的静态方法要困难得多。
答案 2 :(得分:3)
首先,在Thing manipulated = SomeNonExtensionMethod(initial);
案例中,SomeNonExtensionMethod基于与Thing manipulated = initial.SomeExtensionMethod();
案例中完全相同的假设。事情可以改变,SomeExtensionMethod可以破解。这对我们程序员来说就是生命。
其次,当我看到Thing manipulated = initial.SomeExtensionMethod();
时,它并没有告诉我SomeExtensionMethod()的确切实现位置。 Thing可以从TheThing继承它,它继承自TheOriginalThing。所以“误导”的论点无处可去。我敢打赌,IDE会把你带到正确的源头,不是吗?
有什么好处?它使代码更加一致。如果它适用于字符串,则看起来它是否是字符串的成员。在另一个类中使用多个MyThing.doThis()
方法和多个static ThingUtil.doSomethingElse(Mything thing)
方法很难看。
答案 3 :(得分:0)
所以你可以扩展别人的课程。不是你的......这才是优点。 (你可以说..哦,我希望他们实现这个/那......你只是自己做..)
答案 4 :(得分:0)
它们非常适合基于类继承的接口自动混合功能,而不需要该类必须明确地重新实现它。
Linq充分利用了这一点。
使用额外功能装饰类的好方法。应用于接口而非特定类时最有效。仍然是扩展Framework类的好方法。
答案 5 :(得分:0)
它只是方便的语法糖,因此您可以使用相同的语法调用方法,无论它是否实际上是类的一部分。如果A方发布了一个lib,并且B方发布了使用该lib的内容,那么使用class.method(args)调用所有内容比使用方法(class,args)和class.method调用内容更容易。 (参数)。