Pour répondre à la partie «pourquoi» de la question de savoir pourquoi pas List<T>
, les raisons sont la pérennité et la simplicité de l'API.
À l'épreuve du futur
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 ne sont pas virtuelles et ne peuvent donc pas être remplacées, et qu'il n'y a pas de hooks dans ses opérations Add
/ Insert
/ Remove
.
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 la collection que vous retournez à celle que vous pouvez sous-classer, ce qui sera un changement d'interface de rupture (bien sûr, changer la sémantique de choses comme ne pas autoriser null peut également être un changement d'interface, mais des choses comme la mise à jour de l'état de votre classe interne ne le seraient pas).
Ainsi, en renvoyant soit une classe qui peut être facilement sous-classée telle que Collection<T>
ou une interface telle que IList<T>
, ICollection<T>
soit IEnumerable<T>
vous pouvez modifier votre implémentation interne pour qu'elle soit un type de collection différent pour répondre à vos besoins, sans casser le code des consommateurs car il peut toujours être retourné comme le type qu'ils attendent.
Simplicité de l'API
List<T>
contient de nombreuses opérations utiles telles que BinarySearch
, Sort
etc. 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, même si votre classe en interne peut avoir besoin de ces opérations, il est très peu probable que les consommateurs de votre classe veuillent (ou même devraient) les appeler.
En tant que tel, en offrant une classe ou une interface de collection plus simple, vous réduisez le nombre de membres que les utilisateurs de votre API voient et leur facilitez l'utilisation.