2012-09-21 8 views
6

Ich hatte gerade eine dieser "Was die ..." Momente. Ist das Folgende beabsichtigt und gibt es eine obskure Begründung für die "nicht-natürliche" Deklaration von Arrays in C#?C# gezackte Array-Typ-Erklärung in umgekehrter Reihenfolge

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]; 

hätte ich anders herum erwartet. int [,] [] deklariert ein 1-dimensionales Array, wobei jedes Element ein zweidimensionales Array ist.

Lustig obwohl der Name des Typs umgekehrt:

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

jemand das erklären kann? Ist das absichtlich? (Mit .NET 4.5 unter Windows.)

Antwort

7

Sie können eine lange Diskussion in Eric Lipperts Blog Arrays of arrays finden.

Was C# funktioniert tatsächlich

Es ist ein Chaos. Egal welche Option wir wählen, etwas endet nicht passend zu unserer Intuition. Hier ist, was wir eigentlich in C# gewählt haben.

Zunächst einmal: Option zwei [Es ist ein zweidimensionales Array, jedes Element ist ein eindimensionales Array von Ints] ist richtig. Wir zwingen dich, mit der Seltsamkeit zu leben, die Konsequenz One mit sich bringt; Sie machen keinen Elementtyp in ein Array dieses Typs, indem Sie ein Array Specifier anhängen. Sie machen es zu einem Array-Typ, indem Sie den Spezifizierer der Liste der vorhandenen Array-Spezifizierer voranstellen. Verrückt, aber wahr.

Das Wort ‚vorangestellt wird‘ teilweise die Ausgabe des umgekehrten Art-Namen erklärt. Ein CLR-Typname ist nicht unbedingt derselbe wie die C# -Deklaration.

Aber das relevantere Zitat ist unten:

Das alles gesagt, mehrdimensionale zerlumpte Arrays mit ziemlicher Sicherheit ein schlechter Code Geruch sind.

+0

Vielen Dank für den Link. Es erklärt alles. Ich stimme überhaupt nicht mit seinen Überlegungen überein, was "vernünftig" ist, aber das ist ein anderes Thema. Zumindest jetzt weiß ich, dass jemand daran dachte und eine bewusste (aber seltsame) Entscheidung traf. (Vielleicht weil ich Deutscher bin und 24 "Vierundzwanzig" buchstabiere: D) – Imi

0

Ich hatte das gleiche „was der ...“ Moment das erste Mal, dass ich new int[5][]; statt new int[][5]; sah.

EL (sehr schön) Blog-Eintrag tanzt um eine Sache: Es gibt einen perfekten Weg, es für Menschen mit einem ComSci-Grad zu tun, aber keine gute Möglichkeit, es für andere zu tun. Wenn Sie nur der Grammatik folgen, erklären Sie von rechts nach links, new von rechts nach links und Index von links nach rechts:

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

Aber C# 's Zielgruppe ist nicht die Menschen mit 4-Jahres-CS Grad (Die haben alle Reverse Polish gesehen und lieben von rechts nach links.) Der Trick, IMHO, C# gezackte Arrays zu verstehen, ist, dass sie beschlossen haben, spezielle Regeln für sie zu machen, wenn sie es technisch nicht müssen.