为什么 C# 数组没有 Count 属性?

11

可能是重复问题:
在集合中使用count vs length vs size

非常奇怪:

C#数组如下所示:

double[] test = new double[1];

数组支持 Length 属性来获取其长度。但数组也实现了 IList 接口:

IList<double> list = test;

然而,IList接口也提供了一个Count属性。那么这个数组(在本例中为"test")为什么没有呢?

编辑:感谢所有指出事实的人,实际上它是ICollection接口(而不是IList)提供了Count属性,并且这是由于显式实现接口所导致的。


2
...与容量项数相比较(如ListView中的ColumnCountColumns.Count)与NumItems(EnvDTE中的NumIndices)与CountOfItems(EnvDTE中的CountOfLines)等等......我真的爱死微软的框架的一致性了。 :) - user541686
4个回答

18

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

int ICollection.Count { get { return Length; } }

3
+1 分,但我猜他们可能在寻找“为什么”的答案? - user541686
1
@mehrdad - 我希望我身上有我的注释规范 :( - Marc Gravell
1
谢谢你指引我使用显式接口实现 - 我之前完全不知道这种东西存在的;-) - Chris

9

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

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

Length 暗示不可变:你不能向数组添加或删除元素。

列表和其他容器有一个 Count 属性,通常可以更改。

如果你调用 list.Append(1.1);,你会得到一个不支持的异常。


10
长度绝不表示不可变性;MemoryStream(实际上,许多流实现)、StringBuilder等。 - Marc Gravell
@Marc:我并不是想暗示有一个非常严格的规则。流是另一个领域,我认为 StringBuilder.Length 是对 String 的一种让步。我仍然认为它松散地适用于容器。 - H H

5
< p >“Count”属性使用显式接口声明样式进行隐藏,例如在类定义中可以这样写:
int IList.Count {
    get {
        // ...etc...
    }
}

您可以使用类型转换来访问隐藏的方法和属性,例如:
((IList<double>) myArray).Count

5
IList 接口实际上并没有定义 Count 属性;而 ICollection 接口则定义了。 - Marc Gravell
@Marc:接口继承的方式使得这个问题不那么重要了。 - H H
@Henk - 我需要检查一下,如果你犯错了它是否可以编译?我觉得不行... - Marc Gravell
@Henk - 经过测试:“IList.Count”在明确的接口声明中不是接口的成员,所以编译器并不认为这是一个无关紧要的问题。 - Marc Gravell
@Marc:没错,是我犯了错误。我在想Reflector有时会重新排列if语句的成员。 - H H

4

继承自 Array 的类型 可以在运行时获取 IList<T> 的实现(这是如何实现的,不要问我):

在.NET Framework版本2.0中,Array类实现了System.Collections.Generic.IList<T>System.Collections.Generic.ICollection<T>System.Collections.Generic.IEnumerable<T>泛型接口。这些实现是在运行时提供给数组的,因此无法被文档生成工具检测到。因此,在Array类的声明语法中不会出现泛型接口,并且不能通过访问只能通过将数组强制转换为泛型接口类型(显式接口实现)的接口成员来获得参考主题。当您将数组转换为其中一个接口时,需要注意的关键事项是添加、插入或删除元素的成员会抛出NotSupportedException异常。
实际上,IList<T> 实现的作用类似于 显式实现,正如 Marc 在他的回答中解释的那样。这就是为什么你可以从转换的结果中访问 IList<T> 的某些成员,但不能从类型为 T[] 的变量访问特定成员的原因。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接