2010-08-21 4 views
13

Quoi de plus efficace pour rendre les méthodes de retour IList<T> ou IEnumerable<T>?IList <T> vs IEnumerable <T>. Qu'est-ce qui est plus efficace IList <T> ou IEnumerable <T>

IEnumerable<T> est une collection immuable mais IList<T> mutable et contient beaucoup de méthodes et de propriétés utiles.

Pour lancer IList<T>-IEnumerable<T> il est fait référence simplement copie:

IList<T> l = new List<T>(); 
IEnumerable<T> e = l; 

Pour lancer IEnumerable<T>-List<T> nous devons itérer chaque élément ou appeler ToList() méthode:

IEnumerable<T>.ToList(); 

ou peut passer IEnumerable<T>List<T> constructeur faisant la même itération quelque part dans son constructeur.

List<T> l = new List<T>(e); 

Quels cas vous pensez être plus efficace? Lequel préférez-vous dans votre pratique?

Répondre

21

En ce qui concerne l'efficacité, les deux sont des interfaces, donc l'efficacité dépendra de la classe concrète que vous retournez. En règle générale, vous devez toujours renvoyer le type le plus élevé dans la hiérarchie d'objets qui fonctionne pour les utilisateurs de cette méthode. Dans votre cas IEnumerable<T>. Si les consommateurs de la classe doivent ajouter des éléments, accéder aux éléments par index, supprimer les éléments, il vaut mieux utiliser un IList<T>.

Alors, comme toujours dans la programmation: cela dépend :-)

+0

Par exemple, si je retourne méthode mis en œuvre « IEnumerable », puis sur un autre stade de développement i peut être nécessaire de pousser « IList » dans ce cas je dois lancer 'IEnumerable ' à 'IList '. Aussi, je peux dupliquer cette méthode pour en créer une nouvelle qui retourne 'IList '. Mais je ne pense pas que la duplication est un bon choix. Mais pour passer de 'IEnumerable ' à 'IList ' il est seulement une copie de référence d'une autre manière 'IList ' à 'IEnumerable ' c'est chaque élément de copie. Mais la création de 'IList ' nécessitait plus de ressources que de créer 'IEnumerable '. – Kuncevic

+0

Non, ce sont des interfaces. Ce ne sont que des contrats qui ne prennent aucune ressource. Seules les classes concrètes prennent des ressources. Lorsque vous appelez la méthode d'extension 'ToList' sur un' IEnumerable 'ceci crée simplement une' nouvelle liste 'et envoie l'énumérable au constructeur. Bien sûr, les éléments sous-jacents ne sont pas dupliqués, donc vous instanciez simplement un objet qui ne devrait pas prendre beaucoup de mémoire. L'énumérable sous-jacent est stocké par référence. –

+1

Oui, je suis d'accord, "retourne toujours le type qui est le plus haut dans la hiérarchie des objets", il est certainement la façon dont il devrait être. Je pense que c'est la réponse à cette question. – Kuncevic

Questions connexes