¿Cuál es la forma más eficiente de hacer que los métodos devuelvan IList<T>
o IEnumerable<T>
?IList <T> vs IEnumerable <T>. ¿Qué es más eficiente IList <T> o IEnumerable <T>
IEnumerable<T>
es colección inmutable pero IList<T>
mutable y contiene muchos métodos y propiedades útiles.
Para emitir IList<T>
a IEnumerable<T>
es sólo la referencia ejemplar:
IList<T> l = new List<T>();
IEnumerable<T> e = l;
Para la emisión del IEnumerable<T>
a List<T>
necesitamos iterar cada elemento o llamar ToList()
método:
IEnumerable<T>.ToList();
o puede pasar IEnumerable<T>
al constructor List<T>
que hace la misma iteración en algún lugar dentro de su constructor.
List<T> l = new List<T>(e);
¿Qué casos cree que es más eficiente? ¿Cuál prefieres más en tu práctica?
Por ejemplo, si he implementado método que devuelve 'IEnumerable' y luego en otra etapa de desarrollo podría tener que levantar 'IList ' en ese caso necesito echar 'IEnumerable ' a 'IList '. También puedo duplicar este método para crear uno nuevo que devuelva 'IList '. Pero no creo que la duplicación sea una buena opción. Pero para convertir de 'IEnumerable ' a 'IList ', solo se copia de referencia de otra forma 'IList ' a 'IEnumerable ', es cada copia de elemento. Pero la creación de 'IList ' requería más recursos en lugar de crear 'IEnumerable '. –
Kuncevic
No, esas son interfaces. Son solo contratos que no requieren ningún recurso. Solo las clases concretas toman recursos. Cuando se llama al método de extensión 'ToList' en un' IEnumerable 'esto simplemente crea una' nueva lista 'y alimenta el enumerable al constructor. Por supuesto, los elementos subyacentes no están duplicados, por lo que simplemente está creando una instancia de un objeto que no debería ocupar mucha memoria. El enumerable subyacente se almacena por referencia. –
Sí, estoy de acuerdo, "siempre devuelvo el tipo que es más alto en la jerarquía de objetos", definitivamente es la forma en que debería ser. Creo que es la respuesta a esta pregunta. – Kuncevic