Il List<T>
possiede un array T[]
. Utilizza una strategia di crescita esponenziale per questo array, quindi un elenco con elementi n
di solito dispone di un array di supporto con dimensioni maggiori di n
. Anche gli array più piccoli devono essere raccolti dai rifiuti, il che può essere fastidioso se sono abbastanza grandi da essere sul LoH.
Tuttavia, è possibile evitare ciò specificando una capacità manualmente, ad esempio come parametro costruttore. Quindi verrà assegnato un singolo array con la capacità desiderata, in modo da evitare entrambi i problemi di cui sopra.
Inoltre List<T>
ha un piccolo overhead O (1) per l'oggetto elenco stesso.
Tuttavia, non è previsto un sovraccarico per elemento quando si utilizzano i generici. Il runtime crea una versione specializzata per ogni tipo di valore che si passa. Non si verifica la boxe degli elementi.
Ma non è possibile utilizzare la specializzazione del modello di stile C++, in cui si sovraccarica in modo efficace l'implementazione per determinati parametri di tipo. Tutte le istanze generiche condividono lo stesso codice C#.
ovvero non esiste un codice IL specializzato, ma ogni tipo di valore ottiene un'implementazione di codice macchina specializzata basata sullo stesso codice sorgente.
Si vuole dire che Elenco <> è un array quando si tratta di implementazione? –
@Daniel: Sì, una matrice espandibile. – sepp2k
@ DanielMošmondor: [Sì] (http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx): * La classe List (Of T) è l'equivalente generico della classe ArrayList. Implementa l'interfaccia generica IList (Of T) usando un array le cui dimensioni sono aumentate dinamicamente come richiesto. * – Jon