Dipende.
Ho visto questa domanda ha chiesto un paio di volte, ed ecco un bel esempio per illustrare il "dipende" risposta.
Si consideri la seguente classe:
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
restituisce un IEnumerable
e Test2
restituisce una concreta attuazione dell'interfaccia IEnumerable
(List
in quel caso). Qual è il metodo migliore? Test
o Test2
?
In realtà, entrambi sono semanticamente differenti:
- Come
Test
restituisce solo un IEnumerable
, è implica che si tratta di una parte del contratto metodo di che lo sviluppatore utilizza l'oggetto restituito in un'enumerazione (foreach
).
- As
Test2
restituisce un'istanza List
, consente all'utente di accedere agli oggetti dello List
per indice. È un utilizzo completamente diverso dell'oggetto restituito.
private static void Main(string[] args)
{
foreach (var z in MyClass.Test())
{
Console.WriteLine(z);
}
var f = MyClass.Test2()[0];
Console.ReadKey();
}
Se vi aspettate che lo sviluppatore utilizzare l'oggetto restituito in un'enumerazione solo, allora si potrebbe utilizzare l'interfaccia come tipo di ritorno. Se si prevede che lo sviluppatore utilizzi metodi/proprietà dell'implementazione concreta dell'interfaccia (nell'esempio precedente, accesso all'oggetto per indice), è possibile restituire un tipo concreto.
Ricorda anche che a volte non hai scelta. Ad esempio, se si desidera esporre una raccolta pubblica da utilizzare per un binding Silverlight, è necessario restituire ObservableCollection<T>
, non IEnumerable<T>
, poiché il sistema di associazione richiede effettivamente il metodo/proprietà/comportamento della classe ObservableCollection
(IEnumerable
non sarà sufficiente per il legame di lavoro).
Quello che dovresti evitare è un metodo che restituisce IEnumerable<T>
e che viene utilizzato ogni volta con ToList()
.
Odio i metodi che restituiscono IEnumerable quando tutto ciò che otteniamo è un elenco . Non riesco a utilizzare un ciclo for regolare (elemento di riferimento con il suo indice) o anche a chiamare il metodo Count più semplice (senza utilizzare il metodo LINQ Count). Quando tutto ciò che faccio è restituire una lista, il tipo di ritorno che uso è IList . I/I principalmente restituire IEnumerable quando utilizzato in combinazione con un rendimento restituito. Un sidenote: quando si sviluppa una libreria pubblica, l'utilizzo di un oggetto IEnumerable potrebbe tuttavia avere più vantaggi. –
Nullius