2010-10-28 68 views
2

在.NET Framework中,有一些使用SomethingCollection語法的類。爲什麼使用SomethingCollection代替Collection <Something>?

例如,在處理SqlCommand時,它具有SqlParameterCollection類型的參數Parameters。因爲它不具備的IEnumerable<SqlParameter>(或IList<SqlParameter>或類似的東西)形式,它是不可能寫:

foreach (var c in sqlCommand.Parameters) 
{ 
    Debug.WriteLine(string.Concat(c.ParameterName, ": ", c.Value)); 
} 

相反,var必須進行明確的SqlParameter所取代。

處理Windows窗體控件(列表視圖項目的集合等)時,事情非常相似,並且存在於其他類中。

這是什麼東西?爲什麼存在這樣的類,並用它代替泛型IEnumerable s/IList s?

+1

主要是因爲泛型不存在於vanilla .NET – 2010-10-28 02:00:16

回答

7

.NET API公開的許多集合都是在.NET 2.0之前設計的,因此,在泛型可用之前。

+0

中,所以它只是「非常」舊的東西,並且從.NET Framework的第一個版本開始就沒有被重寫過。 – 2010-10-28 02:02:06

+0

我會爲Cobol之類的東西保存「非常」的舊詞,但是,很多遵循該模式的構造都在原始的.NET 1.0和1.1框架中。重寫這些組件將是一個重大的突破性改變,所以最好讓睡覺的狗躺下。 – 2010-10-28 02:08:39

+0

@MainMa:你認爲去改寫東西是一個好主意,因爲你可以在客戶沒有或沒有任何好處的情況下進行重寫,而且你實際上打破了他們的許多代碼? – 2010-10-28 02:20:34

0

.net框架的某些部分有可能是由不同團隊設計的,而且他們有着不同的目標。

域驅動設計的一些從業者會主張使用聚合,這是控制集合中所有對象的根對象,作爲暴露集合產生的一些問題的停止空白的形式。

我猜測使用這種設計的.net框架的部分有限制訪問的原因。

+0

請注意,使用'SomethingCollection'語法不限制對元素的訪問,也不禁止更改,添加或刪除它們。它只是使不可能使用'var'關鍵字。 – 2010-10-28 02:11:41

+0

我誤解了這個問題。謝謝你讓我知道。 – wllmsaccnt 2010-10-28 06:29:05

相關問題