139 votes

Pourquoi le tableau met en œuvre IList?

Voir la définition de Système.Tableau de la classe

public abstract class Array : IList, ...

Théoriquement, je devrais être capable d'écrire ce peu et être heureux

int[] list = new int[] {};
IList iList = (IList)list;

Je doit aussi être capable d'appeler n'importe quelle méthode de la iList

 ilist.Add(1); //exception here

Ma question n'est pas pourquoi j'obtiens une exception, mais plutôt pourquoi le Tableau met en œuvre IList?

91voto

CodesInChaos Points 60274

Car un tableau permet un accès rapide par index, et l' IList/IList<T> se sont la seule collection d'interfaces qui prennent en charge cette. Alors peut-être votre vraie question est "Pourquoi il n'y a pas d'interface pour les constantes des collections avec des indexeurs?" Et à qui je n'ai pas de réponse.

Il n'y a pas readonly interfaces pour les collections. Et il me manque encore plus qu'une constante de taille moyenne avec des indexeurs de l'interface.

IMO il devrait y avoir plusieurs (générique) interfaces de collection en fonction des caractéristiques d'une collection. Et les noms ont été, List pour quelque chose avec un indexeur est vraiment stupide de l'OMI.

  • Juste Énumération IEnumerable<T>
  • Readonly, mais pas de l'indexeur (.Le comte, .Contient,...)
  • Redimensionnable, mais pas de l'indexeur, c'est à dire définir comme (Ajouter, Supprimer,...) en cours ICollection<T>
  • Readonly avec indexation (indexation, indexof,...)
  • Taille constante avec d'indexation (indexation avec un setter)
  • De taille Variable avec l'indexeur (Insertion,...) en cours IList<T>

Je pense que la collection actuelle interfaces sont de mauvaise conception. Mais depuis qu'ils ont des propriétés de vous dire les méthodes qui sont valables(et cela fait partie du contrat de ces méthodes) il ne rompt pas le principe de substitution.

40voto

Brian Rasmussen Points 68853

La section des remarques de la documentation pour IList dit

IList est un descendant de l' Interface ICollection et est la base l'interface de tous les non-générique listes. IList implémentations de l'automne en trois catégories: lecture seule, de taille fixe, et de taille variable. Lecture seule IList ne peut pas être modifié. Une taille fixe IList ne pas permettre l'ajout ou le retrait d'éléments, mais il permet à l' modification d'éléments existants. Un de taille variable, IList permet à l' l'ajout, la suppression et la modification de éléments.

Évidemment, les tableaux de tomber dans la catégorie de taille, de sorte que par la defition de l'interface, cela fait sens.

17voto

Mehrdad Points 70493

Parce que pas tous ILists sont mutables (voir IList.IsFixedSize et IList.IsReadOnly), et les tableaux certainement se comporter comme de taille fixe les listes.

Si votre question est "pourquoi faut-il mettre en œuvre un non-génériques de l'interface", alors la réponse est qu'elles étaient là avant les génériques sont venus le long.

0voto

meir Points 495

Définition de l'interface IList est "Représente un non-générique collection d'objets qui peuvent être individuellement accessibles par l'index.". Tableau complètement satisfait à cette définition, il doit implémenter l'interface. Exception lors de l'appel de méthode Add() est "le Système de.NotSupportedException: la Collecte a été de taille fixe" et a eu lieu parce que la matrice ne peut pas augmenter sa capacité de façon dynamique. Sa capacité est définie lors de la création de l'objet array.

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: