Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Différences entre IList non-générique et IList gén&ampérique

On utilise tous les jours les interfaces IEnumerable, ICollection, IList quand on développe en .Net, pourtant, on ne sait pas toujours ce qui se cache derrière.

Par exemple moi, je me suis demandé quelles sont exactement les méthodes que proposent ces interfaces. Quelle interface propose la méthode Add, ICollection ou IList ?

Les deux. Déjà, elles existent chacune en version non-générique (.Net 1.0, 1.1) et générique (2.0). J'avais toujours cru que ICollection<T> était la retranscription exacte de ICollection en utilisant les types générique, IList<T> la retranscription de IList, etc...

Pourtant ce n'est pas le cas. Pour vous montrer de quoi je parle, j'ai tracé un petit diagramme UML de ces interfaces.

Diagramme de IEnumerable, ICollection, IList et IDictionnary

Déjà, il est assez amusant de noter que ICollection<T> ne dérive pas de ICollection, idem pour IList et IDictionnary. Seul IEnumerable<T> dérive de IEnumerable.

Mais ce qui m'a le plus surpris, c'est que les fonctionnalités de ICollection<T> ne sont pas les mêmes que celles de ICollection (Idem pour IList). Par exemple, Add en version non-générique est dans IList, alors qu'en version générique, elle est dans ICollection<T>. Sans parler de certaines propriétés qui ont disparues. Pourquoi ne pas avoir repris les mêmes interfaces ?

Je me suis donc renseigné, à travers plusieurs blogs, et ce qu'il en ressort c'est que chez Microsoft, au moment de concevoir .Net 2.0, on s'est demandé comment améliorer ces interfaces. Ils ont donc fait une version améliorée pour les interfaces génériques, par contre pour les non-génériques déjà existantes, il était évidement impossible de les modifier pour ne pas rompre la compatibilité.

Je vous donne donc le pourquoi de certaines modifications que j'ai pu glanner sur le blog de Krzysztof Cwalina.

  • Pourquoi certaines méthodes de IList ont été déplacées dans ICollection<T> (Add, Remove, Contains, Clear...) : ICollection était assez inutile dans sa version non-générique, en plus il manquait une abstraction pour représenter une collection gérant la lecture / écriture (Add, Remove, Clear...) mais sans index, c'est donc ICollection<T> qui joue maintenant ce rôle. (Source ici)
  • Pourquoi SyncRoot et IsSynchronized ont disparu de toutes les interfaces génériques : Il se trouve que la synchronisation sur une collection était une chose assez peu utilisée, ces propriétés ont donc été retirées pour ICollection<T>. (Source ici)
  • Pourquoi IsFixedSize a disparu et IsReadOnly a été déplacé : Avec le recul, il est apparu que la seule classe étant FixedSize mais pas ReadOnly est le tableau. Donc seule la propriété IsReadOnly a été laissée, et elle a été placée dans ICollection<T>. (Source ici)

Pour conclure, je trouve que les interfaces génériques sont mieux faites que les non-génériques (ICollection ne servait pas a grand choses, contraiement à ICollection<T>). En tout cas, pour résumer :

  • IEnumerable<T> : Permet seulement d'itérer sur les éléments de la collection.
  • ICollection<T> : Une collection qui gère les ajouts et suppression d'éléments (ce n'était pas le cas pour ICollection) mais pas d'accès aux éléments autre que par un enumérateur.
  • IList<T> : Une collection qui permet l'accès (et insertion, suppression) à ses éléments par un index entier.
  • IDictionary<TKey, TValue> : Une collection qui associe une clé à chaque valeur.
Publié mardi 26 septembre 2006 23:46 par RaptorXP
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Dell Inspiron Mini 9 - Enfin en vente !!! par The diary of EBArtSoft le il y a 5 heures et 34 minutes

- Solution Template et Project Template dans Visual Studio par Atteint de JavaScriptite Aiguë [Cyril Durand] le il y a 8 heures et 16 minutes

- PocketIE et Assignation du SRC d'un Element IMG par Jerome Laban le il y a 9 heures et 8 minutes

- Conversion de fichiers RAW en fichier JPEG avec WPF par Perspective le il y a 9 heures et 44 minutes

- Mise à Jour du Moteur de Recherche des Arrêts de Bus de Montréal par Jerome Laban le il y a 10 heures et 28 minutes

- [WPF] XPSReader v0.2 par Blog Technique d'Audrey PETIT le il y a 11 heures et 29 minutes

- Entity Framework : providers Oracle, MySQL et PostgreSQL par Matthieu MEZIL le il y a 18 heures et 4 minutes

- [WPF] Nouvel article sur c2i.fr par Richard Clark le 09-06-2008, 17:33

- F# nouvelle CTP 1.9.6.2 (update) par Pierrick's Blog le 09-06-2008, 13:27

- La suite ...Proposition de collaboration rédactionnelle entre les communautés de développeurs et Microsoft France par LucasR le 09-05-2008, 17:45