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

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01