Question

Mettre différemment:

Y a-t-il une bonne raison de choisir une collection faiblement typée plutôt qu'une collection de type sécurisé (HashTable vs.Dictionnaire)?Sont-ils toujours là uniquement pour des raisons de compatibilité ?

D'après ce que je comprends, les collections génériques sont non seulement sécurisées, mais leurs performances sont meilleures.


Voici un article complet sur le sujet : Un examen approfondi des structures de données à l'aide de C# 2.0.

Était-ce utile?

La solution

Les collections non génériques sont tellement obsolètes qu'elles ont été supprimées du CoreCLR utilisé dans Silverlight et Live Mesh.

Autres conseils

Il existe également des problèmes de visibilité COM : COM Interop ne peut pas être utilisé avec des génériques.

À l’avenir, seules les collections génériques devraient être utilisées.Il y a aussi l’avantage d’éviter le boxing/unboxing des types dans la collection.Ceci est inefficace, en particulier lorsque vous disposez d'une collection de types de valeur qui sont convertis en System.Object lorsqu'ils sont stockés dans la collection, stockant ainsi les valeurs sur le tas au lieu de la pile d'appels.

En ce qui concerne l'utilisation de collections non génériques pour stocker des collections hétérogènes d'éléments, vous pouvez toujours utiliser List<object> pour accomplir la même chose.Pour cette seule raison, je dirais qu’il n’y a presque aucune raison de toucher à nouveau aux collections non génériques.

L'exception à cela serait de maintenir la compatibilité avec les systèmes écrits dans d'autres langages, ou avec les versions précédentes du framework .NET, mais c'est un cas assez "énervé" si vous me le demandez.

Je peux vous dire que la sérialisation XAML des collections repose sur l'implémentation de IList ou IDictionary, donc les collections non génériques vont être avec nous pendant un certain temps encore.

Je ne sauterais pas et ne dirais pas qu'ils sont obsolètes ou qu'ils vont être supprimés de sitôt.Il est vrai que vous devriez éviter d'utiliser des collections non génériques, sauf si vous avez une raison. pas ne pas utiliser de version générique.Des milliers de lignes de code hérité (pas si ancien) circulent toujours (et le seront pendant des années) qui prennent en charge des collections non génériques telles que ArrayLists.Puisque c'étaient les seulement collections dans .NET 1.0 et 1.1, il a été largement utilisé (et abusé) tout au long de l'année.

Je dois encore occasionnellement interagir avec un ancien mappeur O/R écrit en .NET 1.1 qui renvoie des objets IList.J'ai une méthode qui effectue la conversion en List<> générique, ce qui n'est pas efficace, mais c'est comme ça.

Et si vous avez besoin de stocker différents objets dans le même tableau (bizarre mais possible), vous volonté besoin d'une collection non générique.La pénalité de Boxing et Unboxing est quelque chose que vous devrez payer de toute façon.

N'ayez pas peur de les utiliser si vous sentez que vous devez le faire.

Il peut y avoir des cas où vous devez stocker des objets de types inconnus ou des objets de plusieurs types différents, mais si vous connaissez effectivement le type des objets que vous souhaitez stocker, je ne vois pas de raison de ne pas utiliser la version générique.

Modifier:Comme commenté, vous pouvez simplement utiliser List<Object> - oh !

Oui, d'après ce que j'ai compris, ils ne sont là que pour des raisons de compatibilité avec les produits existants.Vous devez toujours utiliser la version de type sécurisé (c'est-à-direutilisez System.Collections.Generic plutôt que System.Collections).

http://msdn.microsoft.com/en-us/library/ms379564.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top