2012-07-17 118 views
1

许多BCL类具有Methods和ExtensionMethods。当微软拥有他们的类的源代码时,什么是设计决定选择ExtensionMethods over Methods? 谢谢 Smith为什么要使用扩展方法?

+4

因为虽然微软有源代码...我们没有。 – BoltClock 2012-07-17 16:50:53

+0

当他们有源代码时,他们可以添加其他方法,而不是使其成为扩展方法。为什么他们选择将扩展方法添加到BCL类? – LaysomeSmith 2012-07-17 16:57:45

+0

@LaysomeSmith:请举例?所有我在BCL中知道的扩展方法都是在接口上,而不是在类上。 – 2012-07-17 16:59:21

回答

9

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

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

因为接口不具有的功能(只是一个合同),添加扩展方法提供给接口本身。当实现仅需知道接口的使用情况而非实现细节(本身)时,这一点特别方便。

Microsoft 确实一直在他们的BCL类中添加新方法(当然尽管他们尽可能地避免了破坏性更改)。但我相信他们在BCL中使用的大多数扩展方法都在接口上,而不是用于直接将新方法添加到类/结构中的功能。因此,简而言之,当微软选择向单个class(或具有共同基类的家族)添加功能时,他们可能直接添加该方法(所有条件都相同),但如果他们想要对给定接口的所有实现应用新方法,他们可能会在该接口上使用扩展方法。

请记住这一点!因为微软给我们的扩展方法,它适用于他们没有创建的类!例如,您所创建的任何类实现IEnumerable<T>得到LINQ的功能,以及作为奖金,即使你没有继承公共基类等

+0

http://msdn.microsoft.com/en-us/library/system.string.aspx – LaysomeSmith 2012-07-17 17:04:41

+0

@LaysomeSmith:那些扩展方法是因为'IEnumerable ',请记住'string'实现'IEnumerable '。点击其中的大部分,你会发现它们适用于'IEnumerable ',而不是'字符串'直接... – 2012-07-17 17:06:10

+0

无论如何。他们可以将所有这些扩展方法添加为方法?将这些扩展方法作为Microsoft的方法实现是不可能的? – LaysomeSmith 2012-07-17 17:10:16

1

什么是设计决定挑完了方法

ExtensionMethods

一个强有力的理由来挑扩展方法在我看来,它促进了SOLID即开/关主要对扩展开放关闭的修改

0

微软倾向于使用将适用于功能扩展方法广泛的不同nt代码库。例如,LINQ几乎完全是作为扩展方法来实现的。 (如果不是所有您指出的方法都是泛型LINQ方法,那么大部分(不是特定于这些类的方法)。

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

其次,LINQ可以应用于实现IEnumerable的任何对象,包括您自己的代码,如果您实现枚举器。您不必像以前那样编写此代码。第三,它允许将功能分解为不连续的单元,从而创建更好的问题分离并使类更易于维护。

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

相关问题