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?
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
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. –
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