Depende.
He visto esta pregunta un par de veces, y aquí hay un buen ejemplo para ilustrar la respuesta "depende".
Considérese la siguiente clase:
public class MyClass
{
public static IEnumerable<int> Test()
{
return new List<int> { 2, 3, 4 };
}
public static List<int> Test2()
{
return new List<int> { 2, 3, 4 };
}
}
Test
devuelve un IEnumerable
y Test2
devuelve una aplicación concreta de la interfaz IEnumerable
(List
en ese caso). ¿Cuál es el mejor método? Test
o Test2
?
En realidad, ambos son semánticamente diferente:
- Como
Test
sólo se devuelve un IEnumerable
, que implica que es una parte del contrato método que el desarrollador utiliza el objeto devuelto en una enumeración (foreach
)
- Como
Test2
devuelve una instancia de List
, que permite al usuario acceder a los objetos del List
por índice. Es una utilización totalmente diferente del objeto devuelto.
private static void Main(string[] args)
{
foreach (var z in MyClass.Test())
{
Console.WriteLine(z);
}
var f = MyClass.Test2()[0];
Console.ReadKey();
}
Si usted espera que el desarrollador para utilizar el objeto devuelto en una enumeración solamente, entonces se podría utilizar la interfaz como tipo de retorno. Si espera que el desarrollador use métodos/propiedades de la implementación concreta de la interfaz (en el ejemplo anterior, acceso al objeto por índice), puede devolver un tipo concreto.
También recuerde que a veces no tiene otra opción. Por ejemplo, si desea exponer una colección pública que debe usarse para un enlace de Silverlight, debe devolver ObservableCollection<T>
, no IEnumerable<T>
, porque el sistema de enlace realmente necesita el método/propiedades/comportamiento de la clase ObservableCollection
(IEnumerable
no sería suficiente para que el enlace funcione).
Lo que debe evitar es un método que devuelve IEnumerable<T>
y que se usa con ToList()
cada vez.
Odio los métodos que devuelven IEnumerable cuando todo lo que obtenemos es una lista . No puedo usar un bucle for (elemento de referencia con su índice) o incluso invocar el método Count más simple (sin usar el método LINQ Count). Cuando todo lo que hago es devolver una lista, el tipo de devolución que uso es IList . Solo/principalmente devuelvo IEnumerable cuando se utiliza en combinación con un retorno de rendimiento. Una nota al margen: cuando se desarrolla una biblioteca pública, el uso de un IEnumerable podría tener más ventajas. –
Nullius