2011-01-22 19 views
9

Duplicar posible:
count vs length vs size in a collection¿Por qué la matriz C# no tiene propiedad Count?

realmente extraño:

arrays de C# como el siguiente apoyo

double[] test = new double[1]; 

la propiedad de longitud para obtener el tamaño de la formación. Pero las matrices también implementan una interfaz IList:

IList<double> list = test; 

Sin embargo, la interfaz IList también proporciona una propiedad Count. ¿Cómo es que la matriz ("prueba" en este caso) no lo hace?

Editar: Gracias a todos ustedes que señalaron que, de hecho, es la interfaz ICollection (no IList) que proporciona la propiedad Count, y también que esto se debe a la implementación explícita de la interfaz.

+2

... vs vs ** ** ** Capacidad ItemCount ** (como 'ColumnCount' en' 'ListView' vs Columns.Count') vs ** NumItems ** (' 'NumIndices' en EnvDTE ') frente a ** CountOfItems ** (' CountOfLines' en 'EnvDTE') contraetc ... simplemente * amo * la consistencia en los marcos de MS. :) – Mehrdad

Respuesta

14

Simplemente, optaron por llamarlo Length, e implementar Count a través de la implementación de interfaz explícita -algo gusta:

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

+1 de mí, pero supongo que tal vez estaban buscando una respuesta a la parte "por qué"? – Mehrdad

+1

@mehrdad - Desearía tener mis especificaciones anotadas en mí :( –

+1

Gracias por apuntarme a las implementaciones de interfaces explícitas - no tenía idea de que tales cosas existen ;-) – Chris

7

Era una elección de diseño sobre Naming, no semántica.

Las matrices tienen una propiedad Longitud, al igual que la Cadena.

Longitud señales inmutables: No puede Agregar o quitar de una matriz.

Las listas y otros contenedores tienen una propiedad Conde que generalmente puede cambiar.

Ah, y si llama al list.Append(1.1); obtendrá una excepción no admitida.

+10

Longitud de ninguna manera señales inmutables; 'MemoryStream' (en realidad, muchas implementaciones de flujo),' StringBuilder', etc. –

+0

@Marc: No quise implicar una regla muy estricta. Los flujos son otro dominio, y creo que StringBuilder.Length es una concesión a String. Sigo pensando que es poco válido para contenedores. –

4

Tipos heredando de Arrayobtain implementations of IList<T> at run-time (cómo es esto posible, no me pregunte):

En la versión de .NET Framework 2.0, la clase Array implementa el System.Collections.Generic.IList<T>, System.Collections.Generic.ICollection<T>, y System.Collections.Generic.IEnumerable<T> interfaces genéricas. Las implementaciones se proporcionan a las matrices en el tiempo de ejecución, y por lo tanto no son visibles para las herramientas de compilación de documentación. Como resultado, los genéricos interfaces no aparecen en la sintaxis declaración de la clase Array , y hay ninguna referencia temas para los miembros de interfaz que son accesible sólo por colada una matriz para el tipo de interfaz genérica (explícitos implementaciones de interfaz).La clave que hay que tener en cuenta cuando se lanza una matriz a una de estas interfaces es que los miembros que agregan, insertan o eliminan los elementos lanzan NotSupportedException.

En efecto, la aplicación IList<T> actúa como un explicit implementation, como Marc explained en su respuesta. Es por esto que puede acceder a ciertos miembros de IList<T> del resultado de un elenco pero no de una variable escrita como T[] específicamente.

+0

Esa última línea ya estaba en esencia en la pregunta. –

+0

@Henk: tienes razón; Quise destacar la parte de "implementación explícita"; incluso el ejemplo del código era superfluo y solo se distrajo de ese punto. Lo quité. –

3

La propiedad Count se oculta utilizando el estilo de declaración de interfaz explícita, por ejemplo como este en una definición de clase:

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

Puede acceder a los métodos y propiedades ocultos como esto utilizando un molde tipo, por ejemplo,

((IList<double>) myArray).Count 
+4

IList en realidad no define Count; ICollection hace –

+0

@Marc: la forma en que las interfaces heredan hace que sea más bien discutible. –

+0

@Henk - Necesito comprobar, pero ¿* compila * si lo haces mal? No lo creo ... –

Cuestiones relacionadas