为何选择Extension方法?

时间:2012-07-17 16:49:20

标签: c#

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

3 个答案:

答案 0 :(得分:9)

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

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

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

Microsoft 总是在他们的BCL类中添加新方法(当然,尽管他们尽可能避免更改)。但我相信他们在BCL中使用的大多数扩展方法都是在接口上,而不是用于添加可以通过新方法直接添加到类/结构中的功能。

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

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

答案 1 :(得分:1)

  

在方法

上选择ExtensionMethods的设计决策是什么?

我认为选择扩展方法的一个强有力的理由是它促进了SOLID的开放/封闭主体,即为扩展而关闭以进行修改

答案 2 :(得分:0)

Microsoft倾向于使用扩展方法来实现适用于各种不同代码库的功能。例如,LINQ几乎完全作为扩展方法实现。 (并且大多数情况下,如果不是所有指出的方法都是通用的LINQ方法,那么这些方法并不特定)。

这有很多优点。首先,如果您不使用LINQ,则不必包含对LINQ库或using的引用。这减少了代码膨胀。

其次,LINQ可以应用于任何实现IEnumerable的对象,包括您实现枚举器时自己的代码。您不必像其他方式那样编写此代码。

第三,它允许将功能分解为离散单元,从而更好地分离关注点并使类更易于维护。

还有很多其他潜在的好处,但是这个列表应该足以说明扩展方法是实现这些方法的最佳方法。