Pour répondre à la partie «pourquoi» de la question pourquoi pas List<T>
, les raisons sont la pérennité et la simplicité de l'API.
avenir épreuvage
List<T>
n'a pas été conçu pour être facilement extensible par le sous-classer; il est conçu pour être rapide pour les implémentations internes. Vous remarquerez que les méthodes ne sont pas virtuelles et ne peuvent donc pas être remplacées, et qu'il n'y a aucun hook dans ses opérations Add
/Insert
/Remove
. Cela signifie que si vous devez modifier le comportement de la collection à l'avenir (par exemple, pour rejeter les objets nuls que les utilisateurs tentent d'ajouter ou pour effectuer un travail supplémentaire, comme la mise à jour de votre état de classe), vous devez pour changer le type de collection que vous retournez à celui que vous pouvez sous-classer, qui sera un changement d'interface de rupture (bien sûr changer la sémantique des choses comme ne pas autoriser null peut également être un changement d'interface, mais des choses comme être).
en retournant soit une classe qui peut être facilement sous-classé tels que Collection<T>
ou une interface telle que IList<T>
, ICollection<T>
ou IEnumerable<T>
vous pouvez modifier votre implémentation interne pour être un autre type de collection pour répondre à vos besoins, sans casser le code de les consommateurs parce qu'il peut toujours être retourné comme le type qu'ils attendent.
API Simplicité
List<T>
contient un grand nombre d'opérations utiles telles que BinarySearch
, Sort
et ainsi de suite. Cependant, s'il s'agit d'une collection que vous exposez, il est probable que vous contrôliez la sémantique de la liste, et non les consommateurs. Ainsi, alors que votre classe peut avoir besoin de ces opérations en interne, il est très peu probable que les consommateurs de votre classe veuillent (ou même devraient) les appeler. Ainsi, en offrant une classe ou une interface de collecte plus simple, vous réduisez le nombre de membres que les utilisateurs de votre API voient et facilitez leur utilisation.
Cette réponse est morte. Une autre bonne lecture sur le sujet peut être trouvée ici: http://blogs.msdn.com/fxcop/archive/2006/04/27/faq-why-does-donotexposegenericlists-recommend-that-i-expose-collection-lt -t-gt-au lieu-de-liste-lt-t-gt-david-kean.aspx – senfo
Je vois vos premiers points, mais je ne sais pas si je suis d'accord sur votre partie de simplicité API. –
http://stackoverflow.com/a/398988/2632991 Voici également un très bon article sur la différence entre les collections et les listes. –