2012-06-11 9 views
6

Si tengo una función que toma una colección de cierto tipo, ¿qué tipo de parámetro debo usar?
He asumido previamente que IEnumerable es el valor predeterminado, pero me gustaría saber si esto es correcto y, de ser así, por qué.
ICollection también parece ser un candidato válido (debido a su nombre), pero me da la impresión de que los Enumerables son más fáciles de usar.
Pensé que mirar ejemplos que el framework nos proporciona sería una buena idea, pero encuentro que algo como String.Join, solicita una serie de cadenas.Parámetros de función: IEnumerable, ICollection o array?

+1

Este han sido contestadas antes aquí: http://stackoverflow.com/questions/3559868/list-ilist-ienumerable-iqueryable-icollection-which-is-most-flexible-return Mejor Saludos. – Oscar

+3

['String.Join'] (http://msdn.microsoft.com/en-us/library/dd992421.aspx) tenía una sobrecarga agregada en el marco de tiempo de .NET 4 para que tome un' IEnumerable'. La sobrecarga que toma la matriz data de los días pregenéricos ... –

+7

@Oscar: eso es sobre el tipo de retorno; estoy hablando de parámetros. –

Respuesta

10

Usted toma el que menos impone a los clientes pero le permite hacer su trabajo. Si puede salirse con la suya con IEnumerable<T> sobre ICollection<T>, entonces debe usarlo porque esto le da mayor flexibilidad a los clientes de su API.

3

IEnumerable son más preferidos que ICollections. Here es la respuesta generosa a su pregunta.

1

Interfaces se utilizan sobre todo como parámetros o regresan tipos en funciones para apoyar el diseño I en SOLID Principios (Interfaz Segregación Principio) para hacer la colada más fácil, para apoyar pasar múltiples tipos concretos para los parámetros interconectados y ocultar (encapsulación) la efectiva tipo de parámetro de los clientes de sus funciones públicas.

  • Sobre IEnumerable:

muy básico, expone el empadronador, que soporta una iteración simple a través de una colección no genérica.

[ComVisibleAttribute(true)]  
public interface IEnumerable 
  • Así es sobre ICollection:
  • interfaz

El ICollection extiende IEnumerable; IDictionary e IList son interfaces más especializadas que amplían ICollection. Una implementación IDictionary es una colección de pares clave/valor, como la clase Hashtable. Una implementación IList es una colección de valores y se puede acceder a sus miembros por índice, como la clase ArrayList. Algunas colecciones que limitan el acceso a sus elementos, como la clase Queue y la clase Stack, implementan directamente la interfaz ICollection. Si ni la interfaz IDictionary ni la interfaz IList cumplen los requisitos de la colección requerida, obtenga la nueva clase de colección de la interfaz ICollection en su lugar para obtener más flexibilidad.

[ComVisibleAttribute(true)] 
public interface ICollection : IEnumerable 
  • Aquí es alrededor de IList interfaz:

    [ComVisibleAttribute (true)] interfaz pública IList: ICollection, IEnumerable

Más de MSDN sobre IList: IList es una descendiente de la interfaz ICollection y es la interfaz base de todos los li no genéricos pts. Las implementaciones de IList se dividen en tres categorías: de solo lectura, de tamaño fijo y de tamaño variable. Un IList de solo lectura no se puede modificar.Un IList de tamaño fijo no permite la adición o eliminación de elementos, pero permite la modificación de elementos existentes. Un IList de tamaño variable permite agregar, eliminar y modificar elementos.

Consejo:

En caso de que lo que desea es apoyar foreach para su colección de parámetros , IEnumerable debería ser suficiente. En caso de que también desee la compatibilidad con para agregar y eliminar elementos de la colección, IList es , la mejor opción.

Sugerencias: Esta entrada de blog: IEnumerable, ICollection, IList Compared sin duda le ayudará a tomar una mejor decisión y precisa.

Además, mira this article para el rendimiento y otras comparaciones de IList e IEnumerable.

+2

-1: No podría estar más en desacuerdo. ** Siempre ** (para un valor dado de siempre) use la abstracción mínima que hace el trabajo, de esa forma su código de cliente (el código que está escribiendo) no está restringido a usar el mismo contenedor, su función se vuelve más genérico y tiene un mayor potencial de reutilización. –

+0

Bien @BinaryWorrier Actualicé la respuesta para usar IList para que sea una opción solo cuando se requiere soporte para agregar o quitar elementos y para usar IEnumerable si solo se requiere soporte foreach ... Espero que hayas entendido mejor la respuesta ahora ... – VS1

+0

Lo siento pero todavía estoy en desacuerdo. 'IEnumerable ' debe ser preferido ya que es la abstracción mínima. p.ej. Imaginemos que tiene una función que toma una lista de números y obtiene el mínimo, máximo y promedio. Si la función toma una ICollection, puede ser utilizada por cualquier clase que implemente I collection. Si está escrito para tomar IEnumerable, puede funcionar en _ cualquier cosa_, ya que puede escribir fácilmente un adaptador para DataReaders o lectores de archivos que devuelven 'elementos devueltos' sin causar almacenamiento adicional ni sobrecarga de procesamiento, y aún usan la misma función. –

Cuestiones relacionadas