许多BCL类具有Methods和ExtensionMethods。当微软拥有他们的类的源代码时,什么是设计决定选择ExtensionMethods over Methods? 谢谢 Smith为什么要使用扩展方法?
回答
事实上,BCL中的大多数扩展方法不是适用于类,而是适用于接口,这是扩展方法的关键功能。
例如,几乎LINQ的所有对象被实现为扩展到IEnumerable<T>
接口,而不是类List<T>, HashSet<T>
等
因为接口不具有的功能(只是一个合同),添加扩展方法提供给接口本身。当实现仅需知道接口的使用情况而非实现细节(本身)时,这一点特别方便。
Microsoft 确实一直在他们的BCL类中添加新方法(当然尽管他们尽可能地避免了破坏性更改)。但我相信他们在BCL中使用的大多数扩展方法都在接口上,而不是用于直接将新方法添加到类/结构中的功能。因此,简而言之,当微软选择向单个class
(或具有共同基类的家族)添加功能时,他们可能直接添加该方法(所有条件都相同),但如果他们想要对给定接口的所有实现应用新方法,他们可能会在该接口上使用扩展方法。
请记住这一点!因为微软给我们的扩展方法,它适用于他们没有创建的类!例如,您所创建的任何类实现IEnumerable<T>
得到LINQ的功能,以及作为奖金,即使你没有继承公共基类等
http://msdn.microsoft.com/en-us/library/system.string.aspx – LaysomeSmith 2012-07-17 17:04:41
@LaysomeSmith:那些扩展方法是因为'IEnumerable
无论如何。他们可以将所有这些扩展方法添加为方法?将这些扩展方法作为Microsoft的方法实现是不可能的? – LaysomeSmith 2012-07-17 17:10:16
什么是设计决定挑完了方法
ExtensionMethods
一个强有力的理由来挑扩展方法在我看来,它促进了SOLID即开/关主要对扩展开放关闭的修改
微软倾向于使用将适用于功能扩展方法广泛的不同nt代码库。例如,LINQ几乎完全是作为扩展方法来实现的。 (如果不是所有您指出的方法都是泛型LINQ方法,那么大部分(不是特定于这些类的方法)。
这有很多优点。首先,如果您不使用LINQ,则不必包含对LINQ库或使用的引用。这减少了代码膨胀。
其次,LINQ可以应用于实现IEnumerable的任何对象,包括您自己的代码,如果您实现枚举器。您不必像以前那样编写此代码。第三,它允许将功能分解为不连续的单元,从而创建更好的问题分离并使类更易于维护。
还有很多其他潜在的好处,但是这个清单应该足以说明扩展方法是实现这些方法的最佳方式。
- 1. 扩展方法问题。为什么我需要使用someObj = someObj.somemethod();
- 2. 什么是扩展方法,为什么我们需要使用它?
- 3. 为什么作为扩展方法
- 4. 什么是扩展方法?
- 5. 为什么Stream.CopyTo不是扩展方法?
- 6. MEF为什么ComposePart是扩展方法?
- 7. 为什么我必须使用“this”从扩展类中调用扩展方法?
- 8. 为什么Microsoft为自己的类使用扩展方法?
- 9. 为什么我们在扩展方法中使用“this”?
- 10. 为什么C++ CLI不允许使用扩展方法?
- 11. 为什么Asp.net核心使用了很多扩展方法?
- 12. 我为什么要扩展java.lang.RuntimeException
- 13. 使用扩展方法的扩展类
- 14. 为什么java 8使用默认方法而不是扩展方法
- 15. 为什么我无法为静态类创建扩展方法?
- 16. 为什么Scala程序要有主要方法或扩展App特性?
- 17. 扩展IRB主要方法
- 18. 扩展方法需要“this”?
- 19. 为什么使用repmat()扩展数组?
- 20. 为什么需要使用'addChildViewController:'方法
- 21. 为什么要使用BIRT setGlobalVariable()方法?
- 22. AjaxControlToolkit - 扩展 - 什么是“当前”方法?
- 23. 为什么带约束的通用扩展方法不被识别为扩展方法?
- 24. 为什么我需要用$(document.body)来扩展document.body和Mootools Element方法?
- 25. 为什么需要不使用WebExtension(Chrome扩展的Firefox)定义
- 26. 为什么这个扩展方法在Rails中不起作用?
- 27. 为什么这种扩展方法不起作用?
- 28. 为什么扩展方法调用不明确?
- 29. 为什么不能调用扩展方法?
- 30. 使用扩展方法
因为虽然微软有源代码...我们没有。 – BoltClock 2012-07-17 16:50:53
当他们有源代码时,他们可以添加其他方法,而不是使其成为扩展方法。为什么他们选择将扩展方法添加到BCL类? – LaysomeSmith 2012-07-17 16:57:45
@LaysomeSmith:请举例?所有我在BCL中知道的扩展方法都是在接口上,而不是在类上。 – 2012-07-17 16:59:21