2010-10-28 72 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

相关问题