2012-07-17 115 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的任何對象,包括您自己的代碼,如果您實現枚舉器。您不必像以前那樣編寫此代碼。第三,它允許將功能分解爲不連續的單元,從而創建更好的問題分離並使類更易於維護。

還有很多其他潛在的好處,但是這個清單應該足以說明擴展方法是實現這些方法的最佳方式。

相關問題