Perché le matrici in .Net hanno Lunghezza ma altri tipi di raccolta hanno Count? [chiuso]


23

In C # per esempio, le matrici hanno la proprietà Lunghezza. Ma altri tipi di raccolta come elenchi, ecc. Hanno la proprietà Count. C'è un motivo per cui questi due sono diversi? In tal caso, vorrei saperlo.


4
Non riesco a trovare il mio fischio di Lippert, quindi non credo che avremo una buona risposta oggi :(
MetaFight,

4
Solo un'ipotesi selvaggia, poiché non ho alcuna conoscenza interna di come è stato progettato il CLR: i dettagli di come funzionano gli array sono stati specificati prima dei tipi di raccolta. Chiamare la proprietà Length è il nome più naturale per questo, e poiché non esisteva uno standard preesistente a cui conformarsi, questo è ciò che il progettista di array ha scelto di utilizzare. Successivamente le raccolte sono state specificate in seguito, ma Lunghezza non è appropriato per alcune raccolte (implica linearità, quindi per le raccolte non ordinate non è un nome ragionevole), quindi Count è stato scelto come più logicamente coerente.
Jules,

4
Immagino che questo post di StackOverflow abbia la risposta giusta.
Doc Brown,

6
@MetaFight: recentemente ho registrato una serie di video educativi e ad un certo punto menziono che non ho idea del perché i designer abbiano usato sia la lunghezza che il conteggio. Mi è sempre sembrato bizzarro. Il commento di Jules sopra sembra plausibile.
Eric Lippert,

3
Meta note - Ho lanciato il 5 ° VTC poiché non credo che a questa domanda possa essere data una risposta definitiva. La risposta esistente è una risposta solida e plausibile, ma non è supportata da prove. Allo stesso modo, il commento di Lippert mi porta a pensare che nessuno conosca la risposta in quanto avrebbe potuto essere dovuto a una svista anziché a una decisione consapevole.

Risposte:


30

Sono chiamati in modo diverso perché semanticamente sono abbastanza diversi:

Il conteggio di una raccolta è il numero di elementi attualmente memorizzati al suo interno e può potenzialmente cambiare nel tempo.

La lunghezza di un array è il numero massimo di elementi che può contenere (avrà una lunghezza di 10 anche se non ne hai memorizzati molti) ed è immutabile.

Esempio:

Se ho un secchio che può contenere un massimo di 100 palline ha una lunghezza di 100. Se ci metto 50 palline, ha un conteggio di 50.

Se aggiungo altre 10 palline il Conte diventa 60 ma la Lunghezza è ancora 100. Per cambiare la Lunghezza ho bisogno di ottenere un altro bucket.

L'array probabilmente usa la parola Lunghezza perché sotto il cofano sta allocando un blocco contiguo (una lunghezza) di memoria basato sulla capacità moltiplicata per la dimensione dell'oggetto. Sebbene il fatto che la classe List utilizzi "Capacità" per un concetto simile (sebbene mutabile) suggerisce che array può usare la parola "Lunghezza" per ragioni storiche.


12
A T[]con una lunghezza di N memorizza sempre esattamente N valori di tipo T. Semanticamente, non tutti questi valori possono essere significativi (potrebbero essere nullper esempio), ma esistono. Questo è diverso dal solito significato di capacità (come usato List<T>per esempio). Hai ragione che Countpuò cambiare mentre Lengthno. D'altra parte, nulla ha bisogno di Countcambiare. È anche usato per collezioni immutabili.

@delnan oh caro. non capivo che la parola Capacità era già usata in C # in questo modo. L'ho sovraccaricato accidentalmente. Grazie per averlo segnalato. Aggiornerò la mia risposta per chiarire.
combinatoria

La differenza tra Capacità e Lunghezza è: la capacità potrebbe cambiare nel ciclo di vita dell'oggetto, mentre Lunghezza rimane sempre la stessa. Se vedo una proprietà Lunghezza sull'oggetto, suppongo che sia il numero massimo "duro" (o il bordo / indice), mentre se vedo la proprietà Capacità, suppongo che sia il numero massimo "morbido" che dovrei solo controllare contro se mi preoccupo delle prestazioni.
Stupido:

@StupidOne: se segui quel percorso, anche qualsiasi array dovrebbe avere una countproprietà.
Deduplicatore,

1
Accidenti StringBuilder ... in linguaggi più severi come Vigil, la classe StringBuilder sarebbe stata correttamente punita per aver infranto la convenzione github.com/munificent/vigil
Falco,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.