2015-09-17 14 views

risposta

5

Questo è un trucco comune per evitare problemi di prestazioni durante l'impostazione di elementi di matrice che sono tipi di riferimento. Le matrici sono varianti sul CLR (e sulla JVM). È possibile scrivere un string in un object[]. Ciò richiede un runtime per verificare che non si stia effettivamente memorizzando una stringa in SomethingElse[]. Con quel trucco di tipo value non è necessario eseguire quel controllo in fase di esecuzione.

+0

Ma 'ObjectPool' laggiù non imposta alcun elemento nell'array. Si basa sul fatto che la matrice di struct è inizializzata con istanze di struct azzerate. –

+0

Bene, * qualcosa * sta per impostare 'Valore'. Che senso ha se niente mai lo apprezza ?! Quel codice non è mostrato qui. – usr

+0

Sì, qualche codice imposta il campo "Valore". Ma nulla sovrascrive l'elemento in un array. Dato che 'Value' è un campo, non esiste un tipo che ci controlli in runtime. invalida la tua risposta. Non è vero? –

1

Credo che sia per motivi di prestazioni. La matrice di struct è un amico del garbage collector, al contrario di Array of class.

Da 5 Tips and Techniques for Avoiding Automatic GC Collections

Con una serie di istanze di classe, il GC deve controllare ogni elemento tale matrice per vedere se si tratta di un oggetto dal vivo o no (lo stesso vale per collezioni generiche, che usano un array interno). Con una serie di strutture , il GC cerca solo di vedere se l'array stesso è ancora un oggetto live , poiché le strutture non possono essere nulle (questo è vero anche per strutture Nullable, che usano solo un meccanismo di tracciamento interno per determinare la nullità). Quindi questo è potenzialmente pari a migliaia o addirittura a milioni di di elementi che il GC non ha bisogno di esaminare quando viene eseguita una raccolta!

+0

Se ciò era vero, il CLR avrebbe sempre avvolto tutti gli elementi dell'array e non avrebbe dovuto GC ... Anche una serie di strutture deve essere attraversata se contiene riferimenti. – usr

+0

@usr Vedo da dove vieni. Anche io ero scettico quando ho letto per la prima volta l'articolo. Forse l'autore voleva dire che significa solo una matrice di struct che non contiene riferimenti.Dobbiamo raggiungere l'autore per conoscere maggiori dettagli. –

+0

Il GC può saltare solo matrici di tipi di valore se il tipo stesso non contiene riferimenti. Altrimenti deve ancora passare attraverso l'array. –