11 votes

Pourquoi les tableaux C# n'ont-ils pas la propriété Count ?

Duplicata possible :
nombre vs longueur vs taille dans une collection

Vraiment étrange :

Tableaux C# tels que les suivants

double[] test = new double[1];

prend en charge la propriété Length pour obtenir la taille du tableau. Mais les tableaux implémentent également l'interface IList :

IList<double> list = test;

Cependant, l'interface IList fournit également une propriété Count. Comment se fait-il que le tableau ("test" dans ce cas) n'en ait pas ?

Editer : Merci à tous ceux qui ont signalé que c'est en fait l'interface ICollection (et non IList) qui fournit la propriété Count, et que cela est dû à l'implémentation explicite de l'interface.

18voto

Marc Gravell Points 482669

Ils ont simplement choisi de l'appeler Length et mettre en œuvre Count via l'implémentation explicite d'une interface - quelque chose comme :

int ICollection.Count { get { return Length; } }

9voto

Henk Holterman Points 153608

Il s'agissait d'un choix de conception concernant le nommage, et non la sémantique.

Les tableaux ont un Longueur tout comme la propriété String.

Longueur signaux immuables : Il n'est pas possible d'ajouter ou de retirer des éléments d'un tableau.

Les listes et autres conteneurs ont un Compter qui peut généralement changer.

Oh, et si vous appelez list.Append(1.1); vous obtiendrez une exception de non prise en charge.

5voto

Jon Grant Points 7560

Les Count est cachée en utilisant le style de déclaration explicite de l'interface, par exemple comme ceci dans une définition de classe :

int IList.Count {
    get {
        // ...etc...
    }
}

Vous pouvez accéder aux méthodes et aux propriétés cachées de cette manière en utilisant une conversion de type, par exemple

((IList<double>) myArray).Count

4voto

Dan Tao Points 60518

Les types héritant de Array obtenir des implémentations de IList<T> au moment de l'exécution (comment cela est-il possible, ne me demandez pas) :

Dans le fichier .N Array c System.Collections.Generic.IList<T> , System.Collections.Generic.ICollection<T> , a System.Collections.Generic.IEnumerable<T> les interfaces génériques. Les sont fournies aux tableaux au moment de l'exécution , visibles par les outils de construction de de la documentation. Par conséquent, les interfaces génériques n'apparaissent pas dans la syntaxe de déclaration des de la syntaxe de déclaration des Array et il n'y a pas de référence pour les membres de l'interface qui ne sont accessibles uniquement en coulant un tableau dans l'interface générique le type d'interface générique (implémentations explicites). La clé à prendre en compte lorsque l'on coule un vers l'une de ces interfaces est la suivante que les membres qui ajoutent, insèrent ou [ ] NotSupportedException .

En effet, le IList<T> se comporte comme un mise en œuvre explicite , comme Marc a expliqué dans sa réponse. C'est pourquoi vous pouvez accéder à certains membres de l IList<T> à partir du résultat d'un cast mais pas à partir d'une variable typée comme T[] spécifiquement.

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