【问题标题】: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 框架的一致性。 :)

标签: c# arrays inheritance interface ilist


【解决方案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:你是对的;我的意思是强调“显式实现”部分;包括代码示例是多余的,只会分散注意力。我删除了它。
猜你喜欢
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
相关资源
最近更新 更多