为啥 C# 数组没有 Count 属性? [复制]

Posted

技术标签:

【中文标题】为啥 C# 数组没有 Count 属性? [复制]【英文标题】:Why does C# array not have Count property? [duplicate]为什么 C# 数组没有 Count 属性? [复制] 【发布时间】:2011-06-13 18:54:20 【问题描述】:

可能重复:count vs length vs size in a collection

真的很奇怪:

如下C#数组

double[] test = new double[1];

支持Length属性获取数组的大小。但是数组也实现了 IList 接口:

IList<double> list = test;

但是,IList 接口还提供了一个 Count 属性。数组(本例中为“test”)怎么没有?

编辑:感谢所有指出实际上是 ICollection 接口(不是 IList)提供 Count 属性的人,这也是由于接口的显式实现.

【问题讨论】:

... vs Capacity vs ItemCount(如ColumnCount in ListView vs Columns.Count) vs NumItems (NumIndices in EnvDTE) vs CountOfItems (CountOfLines in EnvDTE) vs etc ... 我只是喜欢 MS 框架的一致性。 :) 【参考方案1】:

简单地说,他们选择将其命名为Length,并通过显式接口实现来实现Count - 类似于:

int ICollection.Count  get  return Length;  

【讨论】:

+1 来自我,但我猜他们可能正在寻找“为什么”部分的答案? @mehrdad - 我希望我有带注释的规范:( 感谢您向我指出显式接口实现 - 不知道存在这样的事情 ;-)【参考方案2】:

这是关于命名的设计选择,而不是语义。

数组有一个 Length 属性,字符串也是如此。

Length 信号不可变:您不能添加到数组或从数组中删除。

列表和其他容器具有通常可以更改的 Count 属性。

哦,如果你打电话给list.Append(1.1);,你会得到一个不受支持的异常。

【讨论】:

长度绝不是一成不变的; MemoryStream(其实有很多流实现)、StringBuilder @Marc:我并不是要暗示一个非常严格的规则。 Streams 是另一个领域,我认为 StringBuilder.Length 是对 String 的让步。我仍然认为它松散地适用于容器。【参考方案3】:

Count 属性使用显式接口声明样式隐藏,例如在类定义中如下所示:

int IList.Count 
    get 
        // ...etc...
    

您可以使用类型转换访问像这样隐藏的方法和属性,例如

((IList<double>) myArray).Count

【讨论】:

IList 实际上并没有定义 Count; ICollection 确实 @Marc:接口继承的方式使得这没有实际意义。 @Henk - 我需要检查一下,但是如果你弄错了它会 compile 吗?没想到…… @Henk - 测试:“显式接口声明中的错误 1 ​​'IList.Count' 不是接口的成员” - 所以编译器认为这不是一个有争议的问题。 @Marc:对。我的错。我在想 Reflector 有时会如何改变 if 成员。【参考方案4】:

继承自 Array obtain implementations of IList&lt;T&gt; at run-time 的类型(这怎么可能,别问我):

在 .NET Framework 2.0 版中, Array 类实现 System.Collections.Generic.IList&lt;T&gt;, System.Collections.Generic.ICollection&lt;T&gt;, 和 System.Collections.Generic.IEnumerable&lt;T&gt; 通用接口。 该 提供给数组的实现 在运行时,因此不是 对文档构建可见 工具。结果,通用 接口不会出现在 Array 的声明语法 类,并且没有参考 接口成员的主题是 只能通过将数组转换为 通用接口类型(显式 接口实现)。钥匙 施放时要注意的事情 这些接口之一的数组是 添加、插入或 删除元素抛出 NotSupportedException.

实际上,IList&lt;T&gt; 的实现就像explicit implementation,就像他的回答中的Marc explained。这就是为什么您可以从强制转换的结果中访问 IList&lt;T&gt; 的某些成员,但不能从特定类型为 T[] 的变量中访问。

【讨论】:

最后一行本质上已经在问题中了。 @Henk:你是对的;我的意思是强调“显式实现”部分;包括代码示例是多余的,只会分散注意力。我删除了它。

以上是关于为啥 C# 数组没有 Count 属性? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

数组如何实现 IList<T> 而无需在 C# 中实现属性“Count”? [复制]

为啥将数组拆箱为不正确的类型不会在 C# 中引发异常? [复制]

为啥我不能在 C# 中继承一个类? [复制]

为啥获取私有属性一无所获? (c#) [关闭]

C#中继承类为啥可以通过属性访问基类的私有字段。

为啥我不能在对象数组的 for-in 循环中访问对象属性? [复制]