为啥 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<T>
at run-time 的类型(这怎么可能,别问我):
在 .NET Framework 2.0 版中,
Array
类实现System.Collections.Generic.IList<T>
,System.Collections.Generic.ICollection<T>
, 和System.Collections.Generic.IEnumerable<T>
通用接口。 该 提供给数组的实现 在运行时,因此不是 对文档构建可见 工具。结果,通用 接口不会出现在Array
的声明语法 类,并且没有参考 接口成员的主题是 只能通过将数组转换为 通用接口类型(显式 接口实现)。钥匙 施放时要注意的事情 这些接口之一的数组是 添加、插入或 删除元素抛出NotSupportedException
.
实际上,IList<T>
的实现就像explicit implementation,就像他的回答中的Marc explained。这就是为什么您可以从强制转换的结果中访问 IList<T>
的某些成员,但不能从特定类型为 T[]
的变量中访问。
【讨论】:
最后一行本质上已经在问题中了。 @Henk:你是对的;我的意思是强调“显式实现”部分;包括代码示例是多余的,只会分散注意力。我删除了它。以上是关于为啥 C# 数组没有 Count 属性? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
数组如何实现 IList<T> 而无需在 C# 中实现属性“Count”? [复制]