为何选择Extension方法?

Lay*_*ith 1 c#

许多BCL类都有Methods和ExtensionMethods.当Microsoft拥有其类的源代码时,选择ExtensionMethods而不是方法的设计决策是什么?谢谢你,史密斯

Jam*_*are 9

实际上,BCL中的大多数扩展方法不适用于类,而是适用于接口,这是扩展方法的关键功能.

例如,几乎所有LINQ to对象都实现为IEnumerable<T>接口的扩展,而不是类List<T>, HashSet<T>等.

由于接口没有功能(只是合同),因此向接口添加扩展方法可以为接口本身提供一种方法.当实现只需知道其使用的接口而不是实现细节(本身)时,这尤其方便.

Microsoft 确实一直在他们的BCL类添加新方法(当然它们尽可能避免破坏更改).但我相信他们在BCL中使用的大部分扩展方法都是在接口上,而不是用于添加可以通过新方法直接添加到类/结构中的功能.

因此,简而言之,当Microsoft选择向单个class(或具有公共基类的系列)添加功能时,他们可能只是直接添加方法(所有条件都相同),但是如果他们想要应用新方法在给定接口的所有实现中,他们可能在该接口上使用扩展方法.

还要记住这个!因为Microsoft给了我们扩展方法,它适用于他们没有创建的类!例如,您创建的任何实现的类IEnumerable<T>都会获得LINQ的功能以及奖励,即使您没有继承公共基类等.