Pourquoi les tableaux dans .Net ont-ils une longueur mais d'autres types de collection ont Count? [fermé]

23

En C # par exemple, les tableaux ont la propriété Length. Mais d'autres types de collection comme les listes, etc. ont la propriété Count. Y a-t-il une raison pour laquelle ces deux sont différents? Si oui, j'aimerais savoir.

Arunster
la source
4
Je ne trouve pas mon sifflet Lippert, donc je ne pense pas que nous aurons une bonne réponse aujourd'hui :(
MetaFight
4
Juste une supposition sauvage, car je n'ai aucune connaissance interne sur la façon dont le CLR a été conçu: les détails du fonctionnement des tableaux ont été spécifiés avant les types de collection. L'appel de la longueur de la propriété est le nom le plus naturel, et comme il n'y avait pas de norme préexistante à respecter, c'est donc ce que le concepteur de tableaux a choisi d'utiliser. Ensuite, les collections ont été spécifiées par la suite, mais la longueur n'est pas appropriée pour certaines collections (cela implique la linéarité, donc pour les collections non ordonnées ce n'est pas un nom raisonnable) donc Count a été choisi comme plus cohérent logiquement.
Jules
4
Je suppose que cet ancien message stackoverflow a la bonne réponse.
Doc Brown
6
@MetaFight: J'ai récemment enregistré une série de vidéos éducatives et à un moment donné, je mentionne que je n'ai aucune idée pourquoi les concepteurs ont utilisé à la fois la longueur et le nombre. Cela m'a toujours paru bizarre. Le commentaire de Jules ci-dessus semble plausible.
Eric Lippert
3
Meta note - J'ai lancé le 5ème VTC car je ne pense pas que cette question puisse être résolue définitivement. La réponse existante est une réponse solide et plausible, mais elle n'est pas étayée par des preuves. De même, le commentaire de Lippert m'amène à penser que personne ne connaît la réponse car elle aurait pu être due à un oubli par opposition à une décision consciente.

Réponses:

30

Ils sont nommés différemment car sémantiquement ils sont très différents:

Le nombre d'une collection est le nombre d'éléments actuellement stockés dans celle-ci et peut potentiellement changer au fil du temps.

La longueur d'un tableau est le nombre maximal d'éléments qu'il peut contenir (il aura une longueur de 10 même si vous n'y avez pas stocké autant d'éléments) et est immuable.

Exemple:

Si j'ai un seau qui peut contenir un maximum de 100 balles, il a une longueur de 100. Si j'y mets 50 balles, il a un compte de 50.

Si j'ajoute 10 balles de plus, le compte devient 60 mais la longueur est toujours de 100. Pour changer la longueur, j'ai besoin d'obtenir un seau différent.

Array utilise probablement le mot Longueur car sous le capot, il alloue un bloc contigu (une longueur) de mémoire en fonction de la capacité multipliée par la taille de l'élément. Bien que le fait que la classe List utilise "Capacité" pour un concept similaire (bien que modifiable) suggère que tableau peut utiliser le mot "Longueur" pour des raisons historiques.

combinatoire
la source
12
A T[]avec une longueur de N stocke toujours exactement N valeurs de type T. Sémantiquement, toutes ces valeurs peuvent ne pas être significatives (elles peuvent l'être nullpar exemple), mais elles existent. Ceci est différent du sens habituel de capacité (tel qu'utilisé par List<T>exemple). Vous avez raison, cela Countpeut changer alors que Lengthvous ne le pouvez pas. Là encore, rien n'oblige Countà changer, en fait. Il est également utilisé pour les collections immuables.
@delnan oh cher. ne réalisait pas que le mot Capacité était déjà utilisé en C # comme celui-ci. Je l'ai accidentellement surchargé. Merci de l'avoir signalé. Je mettrai à jour ma réponse pour clarifier.
combinatoire
La différence entre la capacité et la longueur est - La capacité peut changer au cours du cycle de vie de l'objet, tandis que la longueur reste toujours la même. Si je vois une propriété Length sur l'objet, je suppose que c'est le nombre maximum "dur" (ou la bordure / l'index), alors que si je vois la propriété Capacity, je suppose que c'est le nombre maximum "soft" que je ne devrais vérifier que contre si je suis préoccupé par la performance.
StupidOne
@StupidOne: Si vous suivez cette route, tout tableau doit également avoir une countpropriété.
Déduplicateur
1
Merde StringBuilder ... dans des langues plus strictes comme Vigil, la classe StringBuilder aurait été correctement punie pour avoir enfreint la convention github.com/munificent/vigil
Falco