¿Por qué las matrices en .Net tienen Longitud pero otros tipos de colección tienen Cuenta? [cerrado]

23

En C #, por ejemplo, las matrices tienen la propiedad Longitud. Pero otros tipos de colecciones como listas, etc. tienen la propiedad Count. ¿Hay alguna razón por la cual estos dos son diferentes? Si es así, me gustaría saberlo.

Arunster
fuente
44
No puedo encontrar mi silbato Lippert, así que no creo que tengamos una buena respuesta hoy :(
MetaFight
44
Solo una suposición descabellada, ya que no tengo conocimiento interno sobre cómo se diseñó el CLR: los detalles de cómo funcionan las matrices se especificaron antes de los tipos de colección. Llamar a la propiedad Longitud es el nombre más natural para ella, y como no había un estándar preexistente para ajustarse, entonces esto es lo que el diseñador de matrices eligió usar. Luego, las colecciones se especificaron después, pero la longitud no es apropiada para algunas colecciones (implica linealidad, por lo que para colecciones no ordenadas no es un nombre razonable), por lo que Count se eligió como más coherente lógicamente.
Julio
44
Supongo que esta publicación anterior de stackoverflow tiene la respuesta correcta.
Doc Brown
66
@MetaFight: Recientemente grabé una serie de videos educativos y en un momento menciono que no tengo idea de por qué los diseñadores usaron tanto la duración como el recuento. Siempre me ha parecido extraño. El comentario de Jules arriba parece plausible.
Eric Lippert
3
Meta nota: he emitido el quinto VTC ya que no creo que esta pregunta pueda responderse definitivamente. La respuesta existente es una respuesta sólida y plausible, pero no está respaldada por evidencia. Del mismo modo, el comentario de Lippert me lleva a pensar que nadie sabe la respuesta, ya que podría haberse debido a un descuido en lugar de una decisión consciente.

Respuestas:

30

Se nombran de manera diferente porque semánticamente son bastante diferentes:

El recuento de una colección es el número de elementos almacenados actualmente en él y puede cambiar con el tiempo.

La longitud de una matriz es el número máximo de elementos que puede contener (tendrá una longitud de 10 incluso si no ha almacenado tantos elementos en ella) y es inmutable.

Ejemplo:

Si tengo un cubo que puede caber en un máximo de 100 bolas, tiene una longitud de 100. Si pongo 50 bolas en él, entonces tiene una cuenta de 50.

Si agrego 10 bolas más, el conteo se convierte en 60 pero la longitud sigue siendo 100. Para cambiar la longitud, necesito obtener un cubo diferente.

La matriz probablemente usa la palabra Longitud porque debajo del capó está asignando un bloque contiguo (una longitud) de memoria en función de la capacidad multiplicada por el tamaño del elemento. Aunque el hecho de que la clase Lista use "Capacidad" para un concepto similar (aunque mutable) sugiere que la matriz puede usar la palabra "Longitud" por razones históricas.

combinatoria
fuente
12
A T[]con una longitud de N siempre almacena exactamente N valores de tipo T. Semánticamente, no todos esos valores pueden ser significativos (pueden ser, nullpor ejemplo), pero existen. Esto es diferente del significado habitual de capacidad (como se usa por List<T>ejemplo). Tienes razón, eso Countpuede cambiar mientras Lengthque no puede. Por otra parte, nada exige que Count, de hecho, cambie. También se utiliza para colecciones inmutables.
@delnan oh querido. no me di cuenta de que la palabra Capacidad ya se usaba en C # de esta manera. Accidentalmente lo he sobrecargado. Gracias por señalar esto. Actualizaré mi respuesta para aclarar.
combinatoria
La diferencia entre capacidad y longitud es: la capacidad puede cambiar durante el ciclo de vida del objeto, mientras que la longitud siempre se mantiene igual. Si veo una propiedad de Longitud en el objeto, supongo que es un número máximo "duro" (o el borde / índice), mientras que si veo una propiedad de Capacidad, supongo que es un número máximo "suave" que solo debería verificar en contra si me preocupa el rendimiento.
StupidOne
@StupidOne: si sigue esa ruta, cualquier matriz también debería tener una countpropiedad.
Deduplicador
1
Damn StringBuilder ... en idiomas más estrictos, como Vigil the StringBuilder, la clase habría sido castigada por romper la convención github.com/munificent/vigil
Falco