2010-03-12 10 views
11

Si yo estoy exponiendo un miembro interno a través de una propiedad de colección a través de:¿Una colección <T> envuelve un IList <T> o enumera sobre el IList <T>?

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

Cuando esta propiedad se llama lo que sucede? Por ejemplo lo que sucede cuando se llama a las siguientes líneas de código:

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

Está claro que cada vez que esta propiedad se llama se crea un nuevo tipo de referencia, pero lo que sucede Acctually? ¿Simplemente ajusta el IList<T> debajo, enumera sobre el IList<T> y crea una nueva instancia de Collection<T>? Me preocupa el rendimiento si esta propiedad se usa en un bucle for.

+0

'Colección ' envuelve el 'IList '. ¿Por qué lo devuelve como una Colección ? ¿Por qué no exponerlo como IEnumerable ? ¿Estás tratando de evitar la modificación de la lista subyacente? –

+0

Gracias por la pregunta! No pensé que Collection es solo una lista de conteo;) –

Respuesta

4

De acuerdo con reflector, el nuevo Collection<T> simplemente envuelve la IList<T>:

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

Y desde the docs:

Inicializa una nueva instancia de la Colección < (De < (T>)>) clase como un contenedor para la lista especificada.

(énfasis añadido)

así que la pérdida es mínima (la lista no se enumera), y los cambios en la colección devuelta afectará a la lista original.

(Por cierto, estoy asumiendo que usted se refiere a System.Collections.ObjectModel.Collection<T> - no hay una versión genérica de la colección en el espacio de nombres System.Collections de nivel superior.)

+0

Tienes razón, sobre el espacio de nombres. Mi error. Edité el título de la pregunta. –

2

De acuerdo con reflector - aquí es constructor de la Colección:

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

Como puede ver, la colección se envuelve IList y no se copian datos.

Cuestiones relacionadas