Maximale Array-Dimension wie a [1] [1] [1] [1] ... [1] in C #

8

Ich habe gerade gesehen diese Frage und versuchte sie auch zu beantworten. Aber während ich antwortete, dachte ich, was könnte die Antwort im Falle von C # sein? Ich suche ein MSDN-Dokument oder eine relevante Quelle wie in Java

Was ist die maximale Dimension für ein Array in C # wie a[1][1][1][1]....[1] ? Ich habe versucht, auf SO zu suchen, konnte aber nicht finden.

Das Beste, was ich getan habe, war folgendes: "Ein Array könnte theoretisch höchstens 2.147.483.647 Elemente haben, da es einen int für die Indizierung verwendet."

Ich bin mir auch der Tatsache bewusst, dass die maximale Größe, die ein Array aufnehmen kann,

ist

System.Int32.MaxValue

Bitte lassen Sie mich wissen, wenn dies ein Duplikat ist, werde ich meine Frage löschen.

    
Rahul Tripathi 28.03.2014, 13:04
quelle

1 Antwort

17

Das Limit ist 32. Ich habe die Antwort hier gefunden und (mit google) habe ich es mit dem Code: <überprüft / p> %Vor%

Dies gilt für 64- und 32-Bit-Anwendungen.

Eigentlich hätte ich es nicht googeln müssen. Direkt von MSDN :

  

Ein Element ist ein Wert in einem Array. Die Länge eines Arrays ist die Gesamtzahl der Elemente, die es enthalten kann. Der Rang eines Arrays ist die Anzahl der Dimensionen im Array. Die untere Grenze einer Dimension eines Arrays ist der Startindex dieser Dimension des Arrays. Ein mehrdimensionales Array kann unterschiedliche Grenzen für jede Dimension haben. Ein Array kann maximal 32 Dimensionen haben .

Über gezackte Arrays

Ich habe jedoch gerade bemerkt, dass die Syntax, die Sie in Ihrer Bearbeitung verwendet haben (und auch die Syntax, die Peter in den Kommentaren verwendet hat), nicht ist, wie multidimensionale Arrays in C # definiert sind. Mehrdimensionale Arrays sind definiert als:

%Vor%

Und sie sind Arrays von regulären ganzen Zahlen, die zufällig mehrere Dimensionen haben. Die Syntax:

%Vor%

Definiert etwas, das in C # als gezacktes Array bezeichnet wird. Gezackte Arrays sind nur normale, eindimensionale Arrays, die zufällig andere Arrays als Elemente enthalten. Sie können mehrdimensionale Arrays von gezackten Arrays haben oder andersherum, wie der MSDN-Artikel darauf hinweist.

Sie werden jedoch anders behandelt. Gezackte Arrays sind nur Arrays aus (effektiv) regulären * Objekten und werden daher nicht auf die gleiche Weise wie mehrdimensionale Arrays reguliert. Es gibt keine theoretische Grenze für die Anzahl der "Dimensionen", die ein gezacktes Array haben kann, und tatsächlich lässt mich die CLR glücklich den folgenden Code ausführen:

%Vor%

Bis mein System nicht mehr reagiert und abgestürzt ist. Es wurde keine Ausnahme ausgelöst.

Wenn Sie die Schleife auf 1000 Iterationen beschränken, stellen Sie fest, dass der Typ des resultierenden Arrays lautet:

%Vor%

Zusätzlich kann ich, obwohl ich keine Quelle dafür finden kann, die Anzahl der Dimensionen, die ein gezacktes Array haben kann, wahrscheinlich nicht einmal durch die Speicherbeschränkung für einzelne Objekte begrenzen, da jedes Array nur Referenzen auf Objekte hat. Zum Beispiel würde ein gezacktes Array von (eventuell) Int32 mit einem Verschachtelungsfaktor von beispielsweise 1000 und 2 Elementen pro Array eine vernachlässigbare Menge an Speicher (das heißt, für sich genommen) aufnehmen, aber alle Arrays kombiniert würde einen exponentiellen Betrag aufnehmen.

* Mit ein wenig Syntaxzucker. Ein syntaktisch korrekterer Weg zur Kodierung von gezackten Arrays wäre: int[][] arr = new int[][0]; , weil int[] der Elementtyp ist.

Es ist die Implementierung definiert

Die Anzahl der Dimensionen, die ein Array haben kann, scheint implementationsdefiniert zu sein. Die Nummer erscheint nirgendwo in der CLI-Spezifikation, und der von Peter bereitgestellte Code läuft auf Ideones Mono-2.8, wo Es scheint, dass das Limit 255 ist.

    
GregRos 28.03.2014, 13:12
quelle

Tags und Links