38 votes

Pourquoi ArrayList n'est-il pas marqué [Obsolete]?

Après une profonde réflexion et la recherche dans la mise en œuvre de l' ArrayList, personnellement, je veux vraiment dire C'est obsolète, je n'ai pas de raison d'utiliser cette classe après la 2.0. Mais puisqu'il n'est pas marqué comme [Obsolete], est-il d'usage que je ne connaissais pas, mieux que d'utiliser une classe générique? Si oui, veuillez donner un exemple. Merci.

EDIT prenons List<T> comme un exemple, il fournit toutes les fonctions d' ArrayList, et il est fortement typées. Quand donc nous avons besoin d'utiliser ArrayList? Peut-être que parfois, il a une meilleure performance? Je ne sais pas. J'apprécie si vous pouvez me montrer quelque chose de spécial d' ArrayList.

48voto

Jon Skeet Points 692016

Je pense qu'il devrait être considéré comme effectivement obsolète pour le nouveau code, mais il n'y a pas de raison convaincante pour marquer qu'il est obsolète et créer des alertes dans tout le code qui a été écrit avant que la version 2.0 a été publié.

Dans mon expérience, la plupart des types et des membres qui ont été marqué comme obsolète par Microsoft sont activement dangereux à certains égards, et devrait vraiment être fixe si vous avez une base de code de les utiliser. Tout en utilisant ArrayList est douloureux et (au moins théoriquement) enclins à la découverte du type de bugs au moment de l'exécution plutôt que de la compilation, le type fait son travail assez bien... souvent il n'y a vraiment aucune raison de modifier le code existant. C'est le genre de changement que je l'avais considèrent généralement lorsque je l'ai déjà arrivé de travailler sur une zone de code, qui a été à l'aide de ArrayList, plutôt que la recherche active de chaque utilisation de celui-ci.

15voto

Marc Gravell Points 482669

En fait, il est complètement supprimé de Silverlight - l’intention est donc là. Vraisemblablement, il existe tout simplement trop de code ancien existant pour .NET classique qui utilise ArrayList pour le rendre obsolète, d’autant plus que beaucoup de gens utilisent des avertissements en tant qu’erreurs.

Vous ne devriez pas l'utiliser dans un nouveau code sans une bonne raison.

5voto

xanatos Points 30513

Il n'est pas "obsolète" à proprement parler. C'est "obsolète" comme une '70 '80 début des années 90 de la voiture. Si j'avais à choisir entre un List<Object> et ArrayList il y a une TRÈS TRÈS PETITE possibilité, je voudrais utiliser une ArrayList... Oublier... Il ne veut pas mettre en oeuvre IEnumerable<Object>, donc à utiliser Linq je dois utiliser un OfType<Object>().

Pour faire un exemple:

var aaa = new ArrayList();
var aaaa = aaa.OfType<object>().Where(p => p != null);

var bbb = new List<object>;
var bbbb = bbb.Where(p => p != null);

Quelqu'un a finalement upvoted ma réponse, donc je vais ajouter quelque chose à cela :-)

Aviez-vous demandé "voulez-vous utiliser tout non générique de la collection" ma réponse aurait été différente. La table de hachage a une propriété intéressante:

Hashtable est thread-safe pour une utilisation par plusieurs threads de lecture et un seul thread d'écriture. Il est thread-safe pour le multi-thread utiliser lorsque l'un des threads effectuer écriture (mise à jour) de l'exploitation, ce qui permet sans verrouillage lit à condition que les écrivains sont sérialisées sur la table de hachage.

Il y a donc des lieux où l' Hashtable devrait être de mieux qu'un lock + Dictionary ou ConcurrentDictionary (mais vous auriez à l'indice de référence)

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