C#: différence entre la liste et la Collection (CA1002, ne pas exposer les listes génériques) [dupliquer]

cette question a déjà une réponse ici:

a essayé d'exécuter L'analyse de code D'exécution sur un projet ici, et a obtenu un certain nombre d'avertissements qui dit quelque chose comme ceci:

CA1002: Microsoft.Conception : Modification de la Liste< SomeType > '' SomeClass.Certains titres de propriété publique "pour L'utilisation de la Collection, de la collection en lecture seule ou de la collection Keyed

Pourquoi devrais-je utiliser Collection<T> au lieu de List<T> ? Quand je regarde la documentation msdn, ils semblent presque égaux. Après avoir lu l'aide d'erreur pour l'avertissement, j'ai trouvé que

Système

.Collection.Générique.La liste (T)_est une collection générique conçue pour la performance et non pour l'héritage et ne contient donc pas de membres virtuels.

Mais qu'est que cela signifie vraiment? Et que dois-je faire à la place?

dois-je continuer à utiliser List<T> en interne, puis dans les propriétés retourner un new Collection<T>(someList) à la place? Ou devrais-je commencer à utiliser Collection<T> au lieu de List<T> ?

93
demandé sur Svish 2009-08-05 13:24:15

2 réponses

en bref, la liste générique n'a pas de méthodes virtuelles pour Ajouter, Supprimer, etc, car il a été conçu pour être rapide, non extensible. Cela signifie que vous ne pouvez pas échanger cette implémentation concrète pour une sous-classe utile (même si vous pouvez la sous-classe car elle n'est pas scellée).

par conséquent, en exposant la liste elle-même, vous ne pouvez jamais étendre votre collection pour suivre ajouter ou supprimer des opérations (par exemple) sans rompre le contrat public de la classe.

en exposant votre collection comme un IList ou certains-tels, Vous pouvez toujours utiliser la liste comme le soutien-magasin réel, mais vous conservez extensibilité future que vous pouvez swap out la mise en œuvre concerete plus tard sans changer le contrat public de votre classe.

133
répondu Rob Levine 2010-12-23 22:57:28

Collection expose certains membres virtuels (insert, remove, set, clear) que vous pouvez outrepasser et fournir des fonctionnalités supplémentaires (telles que des événements de notification) lorsque la collection est modifiée.

vous pouvez ne pas avoir besoin de cela maintenant, mais c'est une exigence courante pour les classes qui contiennent des collections, il est donc préférable de planifier à l'avance. Parce que Collection est conçu avec extensibilité à l'esprit, il est très flexible. Si dans le futur vous décidez que vous avez besoin d'un peu caractéristique supplémentaire de la collection, vous pouvez simplement l'étendre sans aucune modification de l'interface publique de la classe. Si l'on avait utilisé une liste, vous auriez dû changer pour une collection qui signifie qu'il aurait brisé tous les appelants de votre classe parce qu'ils auraient à être modifié pour utiliser des listes pour.

List d'un autre côté est conçu en fonction de la performance, de sorte qu'il ne doit être utilisé que dans des cas précis où la performance est très importante. Parce qu'il n'est pas les modifications futures extensibles à n'importe quoi en utilisant une liste casseront tout le reste dépendant de lui. Normalement, List ne doit être utilisé à l'interne que dans des classes de très bas niveau et ne doit pas être exposé à quoi que ce soit pour réduire les chances de changements de rupture futurs.

23
répondu Simon P Stevens 2009-08-05 09:28:11