95 votes

C# : Différence entre la liste<T> et Collection<T> (CA1002, n’exposez pas les listes génériques)</T> </T>

Essayé d'exécuter l'Analyse de Code sur un projet, ici, et a obtenu un certain nombre de mises en garde qui dit quelque chose comme ceci:

CA1002 : Microsoft.Conception : Modification de la Liste<SomeType>' dans 'SomeClass.SomeProtectedOrPublicProperty' d'utiliser la Collection, ReadOnlyCollection ou KeyedCollection

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

Système.Les Collections.Génériques.Liste(T)_is une collection générique conçu pour la performance, l'héritage et, par conséquent, ne contient pas de membres virtuels.

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

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

137voto

Rob Levine Points 20793

En bref, la liste générique n'a pas de méthodes virtuelles pour Ajouter, Supprimer, etc, comme il a été conçu pour être rapide, pas extensible. Cela signifie que vous ne pouvez pas permuter cette mise en œuvre concrète de sortir utile à une sous-classe (même si vous pouvez sous-classe car il n'est pas étanche).

Par conséquent, en exposant la Liste elle-même, vous ne pouvez pas prolonger votre collection pour suivre les ajouter ou supprimer des opérations (par exemple) sans casser le marché public de la classe.

En exposant votre collection comme un IList ou certains-par exemple, vous pouvez toujours utiliser la Liste comme le soutien réel magasin, mais vous conservez l'avenir de l'extensibilité comme vous pouvez échanger les concerete mise en œuvre plus tard, sans modification du marché public de votre classe.

24voto

Simon P Stevens Points 17536

Collection expose certains des membres virtuels (insérer, supprimer, ensemble, claire) que vous pouvez remplacer et de fournir des fonctionnalités supplémentaires (tels que des événements de notification) lorsque la collection est changé.

Vous ne pouvez pas besoin de cela maintenant, mais c'est une exigence commune pour les classes qui contiennent les collections, il est donc préférable de planifier à l'avance pour cela. Parce qu' Collection est conçu avec une extensibilité à l'esprit qu'il est très flexible. Si dans l'avenir vous décidez que vous avez besoin d'un peu plus de fonctionnalité dans 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 sur l'autre main est conçu avec des performances à l'esprit, il doit donc être utilisé uniquement dans des cas spécifiques où la performance est très important. Parce qu'il n'est pas extensible à l'avenir des modifications à quoi que ce soit à l'aide d'une liste de casser tout le reste à charge sur elle. Normalement, List doit être utilisé uniquement en interne au sein de très les classes de bas niveau et ne pas être exposés à quoi que ce soit pour réduire le risque de futures modifications importantes.

6voto

Shiraz Bhaiji Points 34901

Il est couvert dans ce billet de blog :

http://blogs.msdn.com/FxCop/archive/2006/04/27/585476.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X