2010-03-12 16 views
11

Jeśli jestem odsłaniając element wewnętrznego poprzez właściwość Collection poprzez:Czy kolekcja <T> zawija IList <T> lub wyliczyć na IList <T>?

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

Gdy ta właściwość jest nazywany co się dzieje? Na przykład, co się dzieje, gdy następujące linie kodu są nazywane:

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

To jasne, że za każdym razem ta właściwość nazywa tworzony jest nowy typ referencyjny ale co acctually dzieje? Czy po prostu zawija pod nią IList<T>, czy wylicza nad IList<T> i tworzy nową instancję Collection<T>? Obawiam się wydajności, jeśli ta właściwość jest używana w pętli for.

+0

'Kolekcja ' opakowuje 'IList '. Dlaczego zwracasz go jako kolekcję ? Dlaczego nie wystawić go jako IEnumerable ? Czy próbujesz zapobiec modyfikacji listy bazowej? –

+0

Dzięki za pytanie! Nie sądziłem, że Collection to tylko opakowanie na liście;) –

Odpowiedz

4

Według reflektor, nowe Collection<T> tylko owija IList<T>:

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

I od the docs:

Inicjuje nowe wystąpienie kolekcji < (z < (T>)>) klasa jako opakowanie dla określonej listy.

(podkreślenie dodane)

więc koszt jest minimalny (lista nie jest wyliczane), a zmiany zwróconej kolekcji wpłynie na oryginalnej listy.

(Nawiasem mówiąc, jestem przy założeniu, że masz na myśli System.Collections.ObjectModel.Collection<T> - nie jest rodzajowy wersja Collection w przestrzeni nazw najwyższego poziomu System.Collections.)

+0

Masz rację, o przestrzeni nazw. Mój błąd. Zmieniłem tytuł pytania. –

2

Według reflektor - tutaj jest konstruktor Kolekcja:

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

Tak jak widać Kolekcja zawija ILIST i żadne dane nie są kopiowane.

Powiązane problemy