2010-03-12 19 views
11

Se sono esponendo un membro interno tramite una proprietà della raccolta tramite:Una collezione <T> esegue il wrapping di un IList <T> o enumerazione tramite IList <T>?

public Collection<T> Entries 
{ 
    get { return new Collection<T>(this.fieldImplimentingIList<T>); } 
} 

Quando questa proprietà viene chiamato cosa succede? Ad esempio ciò che accade quando le seguenti righe di codice sono chiamati:

T test = instanceOfAbove.Entries[i]; 
instanceOfAbove[i] = valueOfTypeT; 

È chiaro che ogni volta questa proprietà viene chiamata viene creato un nuovo tipo di riferimento ma cosa succede acctually? Rende semplicemente il IList<T> al di sotto, si enumera sopra lo IList<T> e per creare una nuova istanza Collection<T>? Sono preoccupato per le prestazioni se questa proprietà viene utilizzata in un ciclo for.

+0

'Collezione ' esegue il wrapping 'IList '. Perché lo stai restituendo come collezione ? Perché non esporlo come IEnumerable ? Stai cercando di impedire la modifica dell'elenco sottostante? –

+0

Grazie per la domanda! Non ho pensato che Collection sia solo un wrapper sulla lista;) –

risposta

4

Secondo Reflector, il nuovo Collection<T> avvolge solo il IList<T>:

public Collection(IList<T> list) 
{ 
    if (list == null) 
    { 
     ThrowHelper.ThrowArgumentNullException(ExceptionArgument.list); 
    } 
    this.items = list; 
} 

E da the docs:

di inizializzare una nuova istanza della Collezione < (Of < (T>)>) classe come wrapper per l'elenco specificato.

(enfasi aggiunta)

Così l'overhead è minimo (l'elenco non è enumerato), e le modifiche alla raccolta restituita interesserà l'elenco originale.

(A proposito, io parto dal presupposto che si riferisce a System.Collections.ObjectModel.Collection<T> - non è una versione generica di raccolta nello spazio dei nomi di primo livello System.Collections.)

+0

Hai ragione riguardo al namespace. Errore mio. Ho modificato il titolo della domanda. –

2

Secondo Reflector - qui è costruttore della collezione:

public Collection(IList<T> list) 
{ 
    if (list == null) 
    { 
     ThrowHelper.ThrowArgumentNullException(ExceptionArgument.list); 
    } 
    this.items = list; 
} 

Quindi, come si può vedere Raccolta avvolge IList e nessun dato viene copiato.

Problemi correlati