2012-09-21 11 views
6

Acabo de tener uno de estos momentos "Qué ...". ¿Está previsto lo siguiente y hay algún oscuro razonamiento detrás de la declaración "no natural" de matrices en C#?C# declaración de tipo de matriz irregular en reversa

int[,][] i; // declares an 2D - array where each element is an int[] ! 
// you have to use it like this: 
i = new int[2,3][]; 
i[1,2] = new int[0]; 

Hubiera esperado al revés. int [,] [] declara una matriz de 1 dimensión donde cada elemento es una matriz bidimensional.

gracioso sin embargo, el nombre del tipo se invierte:

Console.WriteLine(typeof(int[,][]).Name); // prints "Int32[][,]" 

Puede alguien explicar esto? Es esto intencionalmente? (Usando .NET 4.5 en Windows.)

Respuesta

7

Puede encontrar una larga discusión en el blog Eric Lipperts Arrays of arrays.

Lo que realmente hace C#

Es un desastre. No importa qué opción elijamos, algo termina no haciendo juego con nuestra intuición. Esto es lo que realmente elegimos en C#.

Primero off: la opción dos [Es una matriz bidimensional, cada elemento es una matriz unidimensional de ints] es correcta. Te forzamos a vivir con la rareza que conlleva la consecuencia uno; en realidad no crea un tipo de elemento en una matriz de ese tipo al agregar un especificador de matriz . Lo convierte en un tipo de matriz anteponiendo el especificador a la lista de especificadores de matriz existentes. Loco pero cierto

La palabra 'prependiente' explica parcialmente su salida del nombre de tipo invertido. Un nombre de tipo CLR no es necesariamente el mismo que la declaración de C#.

Pero la cita más relevante es en la parte inferior:

Dicho todo esto, matrices multidimensionales irregulares son casi con toda seguridad un mal olor código.

+0

Gracias por el enlace. Eso explica todo. Estoy totalmente en desacuerdo con su razonamiento sobre lo que es "sensato", pero ese es otro tema. Al menos ahora sé que alguien pensó en esto y tomó una decisión consciente (pero extraña). (Tal vez sea porque soy alemán y estoy acostumbrado a deletrear 24 como "cuatro y veinte": D) – Imi

0

que tenían el mismo "... lo que el" momento de la primera vez que vi new int[5][]; en lugar de new int[][5];.

La publicación de blog de EL (muy bonita) está bailando alrededor de una cosa: hay una forma perfecta de hacerlo para personas con un grado de ComSci, pero no es una buena manera de hacerlo por otros. Si usted sólo tiene que seguir la gramática, se declara de derecha a izquierda, new de derecha a izquierda y el índice de izquierda a derecha:

// 1D array of 2D arrays, no special rules needed: 
int[,][] N; N=new[,][5]; N[0]=new int[4,4]; 

Pero público objetivo de C# 's no es gente con 4 años grados CS (que todos han visto polaco inverso y amor de derecha a izquierda.) El truco, en mi humilde opinión, en la comprensión de arrays dentados C# es que decidieron hacer reglas especiales para ellos, cuando técnicamente no lo necesitaban.

Cuestiones relacionadas