許多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. 爲什麼我們在擴展方法中使用「this」?
- 7. 爲什麼Asp.net核心使用了很多擴展方法?
- 8. 爲什麼C++ CLI不允許使用擴展方法?
- 9. 我爲什麼要擴展java.lang.RuntimeException
- 10. 使用擴展方法的擴展類
- 11. 爲什麼我無法爲靜態類創建擴展方法?
- 12. 爲什麼Scala程序要有主要方法或擴展App特性?
- 13. 爲什麼需要使用'addChildViewController:'方法
- 14. 爲什麼要使用BIRT setGlobalVariable()方法?
- 15. 爲什麼帶約束的通用擴展方法不被識別爲擴展方法?
- 16. AjaxControlToolkit - 擴展 - 什麼是「當前」方法?
- 17. 爲什麼需要不使用WebExtension(Chrome擴展的Firefox)定義
- 18. 爲什麼這種擴展方法不起作用?
- 19. 爲什麼這個擴展方法在Rails中不起作用?
- 20. 爲什麼擴展方法調用不明確?
- 21. 擴展方法的使用
- 22. 使用擴展方法
- 23. C# - 使用擴展方法
- 24. .Net - 使用方法擴展?
- 25. 爲什麼使用ConditionalAccessExpression會改變我的擴展方法的工作方式?
- 26. 爲什麼動態類型的擴展方法無法解決?
- 27. 爲什麼javac需要.java擴展名和java不需要.class擴展名
- 28. (Arquillian REST擴展)爲什麼webtarget在測試方法中爲null?
- 29. 什麼時候應該使用HtmlHelper擴展方法?
- 30. 爲什麼我們需要重寫run()方法擴展線程類
因爲雖然微軟有源代碼...我們沒有。 – BoltClock 2012-07-17 16:50:53
當他們有源代碼時,他們可以添加其他方法,而不是使其成爲擴展方法。爲什麼他們選擇將擴展方法添加到BCL類? – LaysomeSmith 2012-07-17 16:57:45
@LaysomeSmith:請舉例?所有我在BCL中知道的擴展方法都是在接口上,而不是在類上。 – 2012-07-17 16:59:21