为什么.Net中的数组具有Length,而其他集合类型具有Count?[关闭]


23

例如,在C#中,数组具有Length属性。但是其他收集类型(如列表等)具有Count属性。这两个有何不同的原因吗?如果是这样,我想知道。


4
我找不到我的Lippert哨音,所以我认为今天我们不会得到很好的答案:(
MetaFight 2015年

4
只是一个疯狂的猜测,因为我对CLR的设计没有内在的了解:在收集类型之前指定了数组工作方式的详细信息。调用属性Length是最自然的名称,并且由于没有预先符合的标准,因此数组的设计者选择使用此属性。然后指定了集合,但是Length不适合某些集合(它暗示线性,因此对于无序集合来说,这不是一个合理的名称),因此Count被选择为逻辑上更一致。
2015年

4
我猜这个前stackoverflow帖子有正确的答案。
布朗

6
@MetaFight:我最近录制了一系列教育视频,有一次我提到我不知道为什么设计师同时使用长度和数量。它总是让我感到奇怪。上述朱尔斯的评论似乎是合理的。
埃里克·利珀特

3
元说明-我投了第五届VTC,因为我不认为这个问题可以得到明确的回答。现有的答案是可靠且合理的答案,但没有证据支持。同样,利珀特的评论使我认为没有人知道答案,因为答案可能是疏忽,而不是有意识的决定。

Answers:


30

它们的名称不同,因为它们在语义上完全不同:

集合的计数是当前存储在其中的项目数,并且可能随时间变化。

数组的长度是它可以容纳的最大项目数(即使您没有在其中存储很多项目,它的长度也为10)并且是不可变的。

例:

如果我有一个最多可容纳100个球的水桶,它的长度为100。如果我将50个球放入其中,那么它的计数为50。

如果我再增加10个球,则“计数”将变为60,但“长度”仍为100。为了更改“长度”,我需要获得一个不同的存储桶。

数组可能使用“长度”一词,因为在幕后它根据容量乘以项目大小来分配连续的内存块(长度)。尽管List类对类似(尽管可变)概念使用“容量”这一事实表明,出于历史原因,数组可能使用单词“ Length”。


12
T[]长度为N的A 始终精确存储type的N个值T。在语义上,并非所有这些值都有意义(null例如,它们可能是有意义的),但是它们存在。这不同于通常的容量含义(List<T>例如,使用的容量)。你是对的,Count可以改变而不能改变Length。再说一遍,Count实际上没有任何规定会改变。它也用于不可变的集合。

@delnan亲爱的。没有意识到像这样在C#中已经使用了Capacity一词。我不小心超载了。感谢您指出了这一点。我将更新我的答案进行澄清。
combinatorics

容量和长度之间的区别是-容量可能会在对象的整个生命周期中发生变化,而长度始终保持不变。如果在对象上看到Length属性,则假定它是“硬”最大数(或边界/索引),而如果看到Capacity属性,则假定它是“软”最大数,我只应检查反对我是否关心性能。
StupidOne

@StupidOne:如果走那条路线,那么任何数组都应该具有count-property。
Deduplicator 2015年

1
该死的StringBuilder ...在更严格的语言中,例如Vigil,StringBuilder类将因违反约定而受到适当惩罚github.com/munificent/vigil
Falco
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.