Mehrdimensionale Arrays und Arrays von Arrays (jagged arrays) sind zwei unterschiedliche Konstruktionen zur Arbeit mit Sammlungen in Visual Basic. Ursprünglich unterstützte VB (VB6, .NET) nur rechteckige (zweidimensionale, dreidimensionale) Arrays. Später wurde in .NET die Unterstützung von Arrays von Arrays als eigenständiges Objekt eingeführt.
Traditionelle mehrdimensionale Arrays (z. B. Dim matrix(2,3) As Integer) sind nützlich, wenn die Datentabelle unbedingt rechteckig sein muss. Arrays von Arrays (jagged) wurden in VB.NET eingeführt und ermöglichen das Erstellen von unregelmäßigen Zeilen: Die Anzahl der Elemente im inneren Array kann variieren.
Eine falsche Wahl des Ansatzes führt entweder zu ineffizientem Speicherverbrauch (z. B. sind bei rechteckigen Arrays alle Zeilen festgelegt) oder zu inkorrekter Logik beim Zugriff auf die Elemente (es kann zu einem „Index außerhalb des Bereichs“-Fehler kommen). Oft werden Syntax und Initialisierungsarten verwechselt.
Rechteckige (multidimensionale) Arrays werden gewählt, wenn der Inhalt immer vollständig ist (z. B. ein Spielfeld). Jagged-Arrays werden verwendet, wenn die Zeilen unterschiedliche Längen haben (z. B. Listen von Schülern in verschiedenen Klassen). Der Zugriff auf die Elemente unterscheidet sich zwischen ihnen.
Beispielcode:
' Mehrdimensionales Array Dim rect(1, 2) As Integer ' 2 Zeilen, 3 Spalten (Null-basiert) rect(0,0) = 1 : rect(0,1) = 2 : rect(0,2) = 3 rect(1,0) = 4 : rect(1,1) = 5 : rect(1,2) = 6 ' Jagged-Array Dim jagged(2)() As Integer ' Array mit 3 Elementen, von denen jedes ein Array ist jagged(0) = New Integer() {1, 2} jagged(1) = New Integer() {3, 4, 5} jagged(2) = New Integer() {6} Console.WriteLine(rect(1,2)) ' 6 Console.WriteLine(jagged(1)(2)) ' 5
Wichtige Merkmale:
Kann man ein jagged-Array mit Dim a(2,3) As Integer definieren?
Antwort: Nein, dies würde ein rechteckiges Array erstellen. Arrays von Arrays werden so definiert: Dim a(2)() As Integer oder Dim a As Integer()().
Was passiert, wenn man das innere Array einer jagged-Struktur nicht initialisiert und versucht, auf ein Element zuzugreifen?
Antwort: Es wird eine NullReferenceException geworfen, da das innere Array nicht erstellt wurde.
Wie unterscheidet sich die Syntax für das Abrufen der Länge einer Dimension eines eindimensionalen Arrays von der eines jagged-Arrays?
Antwort: Für rechteckige: a.GetLength(0) (Anzahl der Zeilen), a.GetLength(1) (Anzahl der Spalten). Für jagged: a.Length (Anzahl der Zeilen), a(i).Length (Anzahl der Elemente in Zeile i).
Zur Speicherung einer Schülerliste nach Klassen wurde ein rechteckiges Array (10, 30) gewählt – nicht verwendete leere Elemente. Ein Teil der Klassen hat weniger Schüler als die maximale Anzahl.
Vorteile:
Nachteile:
Ein jagged-Array wird verwendet: Jedes innere Array ist eine echte Liste von Schülern einer Klasse, was die Speichereffizienz und einfache Verarbeitung optimiert.
Vorteile:
Nachteile: