Pour répondre à la partie "pourquoi" de la question de savoir pourquoi pas List<T>
Les raisons en sont la pérennité et la simplicité de l'API.
Préparer l'avenir
List<T>
n'est pas conçu pour être facilement extensible en le sous-classant ; il est conçu pour être rapide pour les implémentations internes. Vous remarquerez que les méthodes qu'il contient ne sont pas virtuelles et ne peuvent donc pas être surchargées, et qu'il n'y a pas de crochets dans sa fonction Add
/ Insert
/ Remove
opérations.
Cela signifie que si vous avez besoin de modifier le comportement de la collection à l'avenir (par exemple, pour rejeter les objets nuls que les gens essaient d'ajouter, ou pour effectuer un travail supplémentaire lorsque cela se produit, comme la mise à jour de l'état de votre classe), vous devez changer le type de collection que vous retournez en un type que vous pouvez sous-classer, ce qui sera un changement d'interface de rupture (bien sûr, changer la sémantique des choses comme ne pas autoriser les objets nuls peut également être un changement d'interface, mais des choses comme la mise à jour de votre état de classe interne ne le serait pas).
Ainsi, en renvoyant une classe qui peut être facilement sous-classée, telle que Collection<T>
ou une interface telle que IList<T>
, ICollection<T>
o IEnumerable<T>
vous pouvez modifier votre implémentation interne pour qu'elle soit d'un type de collection différent afin de répondre à vos besoins, sans casser le code des consommateurs car elle peut toujours être retournée comme le type qu'ils attendent.
Simplicité de l'API
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, bien que votre classe puisse avoir besoin de ces opérations en interne, il est très peu probable que les consommateurs de votre classe veuillent (ou même doivent) les appeler.
Ainsi, en proposant une classe ou une interface de collection plus simple, vous réduisez le nombre de membres que les utilisateurs de votre API voient et vous facilitez son utilisation.