Warum haben Arrays in .Net eine Länge, andere Auflistungstypen jedoch eine Anzahl? [geschlossen]

23

In C # haben Arrays beispielsweise die Eigenschaft Length. Andere Sammlungstypen wie Listen usw. haben jedoch die Eigenschaft Count. Gibt es einen Grund, warum diese beiden unterschiedlich sind? Wenn ja, würde ich gerne wissen.

Arunster
quelle
4
Ich kann meine Lippert-Pfeife nicht finden, daher glaube ich nicht, dass wir heute eine gute Antwort bekommen werden :(
MetaFight
4
Nur eine wilde Vermutung, da ich keine Ahnung habe, wie die CLR entworfen wurde: Die Details der Funktionsweise von Arrays wurden vor den Auflistungstypen angegeben. Die Eigenschaft Länge zu nennen ist der natürlichste Name dafür, und da es keinen Standard gab, dem man sich anpassen konnte, entschied sich der Entwickler von Arrays, diesen zu verwenden. Anschließend wurden die Auflistungen angegeben, aber die Länge ist für einige Auflistungen nicht angemessen (dies impliziert Linearität, daher ist es für ungeordnete Auflistungen kein vernünftiger Name), sodass Count als logisch konsistenter ausgewählt wurde.
Jules
4
Ich denke, dieser ehemalige Stackoverflow-Beitrag hat die richtige Antwort.
Doc Brown
6
@MetaFight: Ich habe kürzlich eine Reihe von Lehrvideos aufgenommen und erwähne an einer Stelle, dass ich keine Ahnung habe, warum die Designer sowohl Länge als auch Anzahl verwendet haben. Es hat mich immer als bizarr empfunden. Der Kommentar von Jules oben scheint plausibel.
Eric Lippert
3
Meta-Note - Ich habe die 5. VTC besetzt, da ich nicht glaube, dass diese Frage definitiv beantwortet werden kann. Die vorhandene Antwort ist eine solide und plausible Antwort, die jedoch nicht belegt ist. Ebenso lässt mich Lipperts Kommentar vermuten, dass niemand die Antwort kennt, da dies auf ein Versehen im Gegensatz zu einer bewussten Entscheidung zurückzuführen sein könnte.

Antworten:

30

Sie werden unterschiedlich benannt, weil sie semantisch sehr unterschiedlich sind:

Die Anzahl der Elemente einer Sammlung ist die Anzahl der aktuell darin gespeicherten Elemente und kann sich möglicherweise im Laufe der Zeit ändern.

Die Länge eines Arrays ist die maximale Anzahl von Elementen, die es aufnehmen kann (es hat eine Länge von 10, auch wenn Sie nicht so viele Elemente darin gespeichert haben) und ist unveränderlich.

Beispiel:

Wenn ich einen Eimer habe, in den maximal 100 Bälle passen, hat er eine Länge von 100. Wenn ich 50 Bälle hineinlege, hat er eine Anzahl von 50.

Wenn ich 10 weitere Bälle hinzufüge, wird der Count auf 60 gesetzt, aber die Länge beträgt immer noch 100. Um die Länge zu ändern, muss ich einen anderen Eimer bekommen.

Array verwendet wahrscheinlich das Wort Length, weil es unter der Haube einen zusammenhängenden Speicherblock (eine Länge) auf der Grundlage der Kapazität multipliziert mit der Elementgröße zuweist. Obwohl die List-Klasse "Capacity" für ein ähnliches (wenn auch veränderliches) Konzept verwendet, lässt dies darauf schließen, dass Array aus historischen Gründen möglicherweise das Wort "Length" verwendet.

Kombinatorik
quelle
12
A T[]mit einer Länge von N speichert immer genau N Werte vom Typ T. Semantisch mögen nicht alle diese Werte von Bedeutung sein (sie könnten nullzum Beispiel sein), aber sie existieren. Dies unterscheidet sich von der üblichen Bedeutung von Kapazität (wie sie beispielsweise von verwendet wird List<T>). Du hast recht, das Countkann sich ändern, Lengthaber nicht. Andererseits gibt es nichts, was Countsich tatsächlich ändern würde. Es wird auch für unveränderliche Sammlungen verwendet.
@delnan oh mein Lieber. wusste nicht, dass das Wort Capacity in C # bereits so verwendet wurde. Ich habe es versehentlich überladen. Vielen Dank für den Hinweis. Ich werde meine Antwort aktualisieren, um dies zu klären.
Kombinatorik
Unterschied zwischen Kapazität und Länge ist - Die Kapazität kann sich im Laufe des Lebenszyklus des Objekts ändern, während die Länge immer gleich bleibt. Wenn ich eine Length-Eigenschaft für das Objekt sehe, würde ich davon ausgehen, dass es sich um eine "harte" maximale Anzahl (oder den Rahmen / Index) handelt, während ich bei der Capacity-Eigenschaft eine "weiche" maximale Anzahl annehme, die ich nur überprüfen sollte dagegen, wenn ich mit der Leistung befasst bin.
StupidOne
@StupidOne: Wenn Sie diesen Weg gehen, sollte jedes Array auch eine count-Eigenschaft haben.
Deduplicator
1
Verdammt ... Stringbuilder in strengen Sprachen wie Vigil die Klasse String richtig gewesen wäre , für das Brechen von Konvention bestraft github.com/munificent/vigil
Falco