.Netの配列にはLengthがあるのに、他のコレクションタイプにはCountがあるのはなぜですか?[閉まっている]


23

たとえば、C#では、配列にLengthプロパティがあります。ただし、リストなどの他のコレクションタイプにはCountプロパティがあります。これら2つが異なる理由はありますか?もしそうなら、私は知りたいです。


4
私は私のリッパーホイッスルを見つけることができないので、今日良い答えを得るとは思わない:(
MetaFight

4
CLRがどのように設計されているかについての内部知識がないので、配列の動作の詳細はコレクション型の前に指定されていたので、ちょっとした推測です。プロパティの長さを呼び出すことは最も自然な名前であり、準拠する既存の標準がなかったため、これが配列の設計者が使用することを選択したものです。その後、コレクションが指定されましたが、一部のコレクションでは長さが適切ではありません(線形性を意味するため、順序付けられていないコレクションでは合理的な名前ではないため)。
ジュール

4
この前のstackoverflowの投稿には正しい答えがあると思います。
Doc Brown

6
@MetaFight:最近、一連の教育ビデオを録画しましたが、ある時点で、デザイナーが長さとカウントの両方を使用した理由がわからないことを述べました。それはいつも奇妙であると私を襲ってきました。上記のジュールからのコメントはもっともらしいようです。
エリックリッパー

3
メタメモ-この質問に明確に答えられるとは思わないので、5番目のVTCをキャストしました。既存の答えは堅実でもっともらしい答えですが、証拠に裏付けられていません。同様に、リッパートのコメントは、意識的な決定とは対照的に見落としによるものである可能性があるため、誰も答えを知らないと思うように導きます。

回答:


30

それらは意味的にまったく異なるため、異なる名前が付けられます。

コレクションのカウントは、現在そのコレクションに格納されているアイテムの数であり、時間とともに変化する可能性があります。

配列の長さは、保持できるアイテムの最大数であり(多くのアイテムを格納していない場合でも長さは10になります)、不変です。

例:

最大100個のボールを入れることができるバケットがある場合、長さは100になります。50個のボールを入れると、カウントは50になります。

さらに10個のボールを追加すると、カウントは60になりますが、長さは100のままです。長さを変更するには、別のバケットを取得する必要があります。

配列はおそらく、「長さ」という単語を使用します。なぜなら、内部では、容量にアイテムサイズを掛けた値に基づいて、連続したメモリブロック(長さ)が割り当てられるからです。Listクラスが同様の(可変ではあるが)概念に「Capacity」を使用しているという事実は、配列が歴史的な理由で「Length」という単語を使用していることを示唆しています。


12
T[]長さがNのA は、常にtypeの正確にN個の値を格納しますT。意味的には、これらの値のすべてが意味があるとは限りませんが(nullたとえば、意味があるかもしれません)、存在します。これは通常の容量の意味とは異なります(List<T>たとえば、)。Count変えることはできますが、変えるLengthことはできません。繰り返しにCountなりますが、実際に変化することを強制するものはありません。また、不変のコレクションにも使用されます。

@delnanまあ。このような容量がC#で既に使用されていることを認識していませんでした。誤ってオーバーロードしました。これを指摘してくれてありがとう。答えを更新して明確にします。
組み合わせ

容量と長さの違いは次のとおりです。容量はオブジェクトのライフサイクルで変化する可能性がありますが、長さは常に同じです。オブジェクトにLengthプロパティが表示されている場合、「ハード」最大数(または境界/インデックス)であると想定しますが、Capacityプロパティが表示されている場合は、チェックする必要がある「ソフト」最大数であると想定します私はパフォーマンスに関心がある場合に対して。
StupidOne

@StupidOne:そのルートに行く場合、すべての配列にも-プロパティが必要countです。
デュプリケータ

1
StringBuilderのくそ...ビジルのような厳格な言語でのStringBuilderクラスが正しく大会の破壊のために処罰されていたであろうgithub.com/munificent/vigilを
ファルコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.