2010-03-12 9 views
11

Wenn ich über einen Innenteil über eine Eigenschaft Collection am aussetzt:Verarbeitet eine Collection <T> eine IList <T> oder listet sie über die IList auf <T>?

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

Wenn diese Eigenschaft aufgerufen wird, was passiert? Zum Beispiel, was passiert, wenn die folgenden Codezeilen genannt werden:

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

Es ist klar, dass jedes Mal, diese Eigenschaft eine neue Referenztyp erstellt genannt wird, aber was passiert, acctually? Umschließt es einfach die IList<T> darunter, zählt es über die IList<T> und um eine neue Collection<T> Instanz zu erstellen? Ich mache mir Sorgen über die Leistung, wenn diese Eigenschaft in einer for-Schleife verwendet wird.

+0

'Sammlung ' wickelt die 'IList '. Warum geben Sie es als eine Sammlung zurück? Warum nicht als IEnumerable ? Möchten Sie Änderungen an der zugrunde liegenden Liste verhindern? –

+0

Danke für die Frage! Ich habe nicht gedacht Collection ist nur ein Wrapper über Liste;) –

Antwort

4

Nach Reflektor, der neue Collection<T> gerade wickelt die IList<T>:

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

Und von the docs:

Initialisiert eine neue Instanz der Sammlung < (Of < (T>)>) Klasse als Wrapper für die angegebene Liste.

(Hervorhebung hinzugefügt)

So ist der Aufwand minimal ist (die Liste ist nicht aufgezählt), und Änderungen an der zurückgegebenen Auflistung wird die ursprüngliche Liste beeinflussen.

(By the way, ich gehe davon aus, Sie beziehen sich auf System.Collections.ObjectModel.Collection<T> - es ist nicht eine generische Version von Collection in der Top-Level-Namespace System.Collections.)

+0

Du hast recht, über den Namespace. Mein Fehler. Ich habe den Fragetitel bearbeitet. –

2

Reflektor nach - hier ist Konstruktor der Sammlung:

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

So, wie Sie sehen können, wird IList umschlossen und keine Daten kopiert.

Verwandte Themen