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?
Respuesta
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.
IEnumerable son más preferidos que ICollections. Here es la respuesta generosa a su pregunta.
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.
-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. –
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
Lo siento pero todavía estoy en desacuerdo. 'IEnumerable
- 1. ¿Por qué ArrayList implementa IList, ICollection, IEnumerable?
- 2. Fuerza protobuf-net para ignorar interfaces IEnumerable/ICollection
- 3. EF ICollection Vs Lista Vs IEnumerable Vs IQueryable
- 4. Convertir de Array para iCollection <T>
- 5. ¿Por qué ICollection <T> implementar tanto IEnumerable <T> y IEnumerable
- 6. Parámetros de función: ¿Copia o puntero?
- 7. Java Convert Array a los parámetros
- 8. List, IList, IEnumerable, IQueryable, ICollection, ¿cuál es el tipo de devolución más flexible?
- 9. ¿Cuál es la forma más fácil y más compacta de crear un IEnumerable <T> o ICollection <T>?
- 10. T en clase? AddRange ICollection?
- 11. ¿Está bien para devolver una lista interna <T> como IEnumerable <T> o ICollection <T>?
- 12. Función o método con un número desconocido de parámetros
- 13. ICollection vs ICollection <T> - La ambigüedad entre ICollection <T> .Count y ICollection.Count
- 14. Diferencia entre IEnumerable e IEnumerable <T>?
- 15. ¿Por qué la función == de Array no es verdadera para Array (1,2) == Array (1,2)?
- 16. Parámetros de función en PowerShell
- 17. C: función de señal (parámetros?)
- 18. Agregar a una ICollection
- 19. array php - mayúscula o minúscula
- 20. ¿Cómo pasar array como múltiples parámetros para funcionar?
- 21. ¿Cómo "aplanar" o "indexar" 3D-array en 1D array?
- 22. SFINAE con parámetros inválidos de tipo de función o tipo de matriz?
- 23. Parámetros de función número máximo
- 24. función de Java variadic parámetros
- 25. Parámetros de la función - Python
- 26. ¿Qué debo usar un IEnumerable o IList?
- 27. Parámetros Moq Match y Verificar Matriz/IEnumerable en la configuración del método
- 28. Parámetros de la función de devolución de llamada USORT PHP
- 29. Inicializando la matriz de impulso con std :: vector o array
- 30. ¿Cuál es la diferencia entre IEnumerable y Array, IList y List?
Este han sido contestadas antes aquí: http://stackoverflow.com/questions/3559868/list-ilist-ienumerable-iqueryable-icollection-which-is-most-flexible-return Mejor Saludos. – Oscar
['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 ... –
@Oscar: eso es sobre el tipo de retorno; estoy hablando de parámetros. –