Gli array multidimensionali e gli array a strati (jagged arrays) sono due diverse strutture per lavorare con collezioni in Visual Basic. Inizialmente VB (VB6, .NET) supportava solo array rettangolari (bidimensionali, tridimensionali). Successivamente, in .NET è stato introdotto il supporto per gli array a strati come oggetto separato.
Gli array multidimensionali tradizionali (ad esempio, Dim matrix(2,3) As Integer) sono utili quando la tabella dei dati deve essere rettangolare. Gli array a strati (jagged) sono stati introdotti in VB.NET con la possibilità di creare righe irregolari: il numero di elementi nell'array interno può variare.
Una scelta errata dell'approccio porta a un uso inefficiente della memoria (ad esempio, gli array rettangolari hanno tutte le righe fisse) o a una logica di accesso agli elementi non corretta (si può ricevere un errore di accesso fuori intervallo). Spesso si confondono la sintassi e i modi di inizializzazione.
Si scelgono array rettangolari (multidimensionali) se il contenuto è sempre completo (ad esempio, un campo di gioco). Gli array a strati sono utilizzati quando le righe hanno lunghezze diverse (ad esempio, liste di alunni di diverse classi). L'accesso agli elementi tra di loro differisce.
Esempio di codice:
' Array multidimensionale Dim rect(1, 2) As Integer ' 2 righe, 3 colonne (indicizzazione da zero) rect(0,0) = 1 : rect(0,1) = 2 : rect(0,2) = 3 rect(1,0) = 4 : rect(1,1) = 5 : rect(1,2) = 6 ' Array a strati Dim jagged(2)() As Integer ' array di 3 elementi, ognuno dei quali è un array 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
Caratteristiche chiave:
Si può definire un array a strati usando Dim a(2,3) As Integer?
Risposta: No, questo creerà un array rettangolare. Gli array a strati si definiscono così: Dim a(2)() As Integer o Dim a As Integer()().
Cosa succede se non inizializzi l'array interno della struttura a strati e provi ad accedere a un elemento?
Risposta: Verrà generata un'eccezione NullReferenceException, poiché l'array interno non è stato creato.
Qual è la differenza di sintassi per ottenere la lunghezza di una dimensione di un array monodimensionale e di un array a strati?
Risposta: Per rettangolare: a.GetLength(0) (numero di righe), a.GetLength(1) (numero di colonne). Per a strati: a.Length (numero di righe), a(i).Length (numero di elementi nella riga i).
Per memorizzare un elenco di alunni per classi è stato scelto un array rettangolare (10, 30) - gli elementi vuoti non vengono utilizzati, alcune classi hanno meno del numero massimo di alunni.
Pro:
Contro:
Viene utilizzato un array a strati: ogni array interno è un elenco reale di alunni di classe, ottimizzazione della memoria e facilità di elaborazione.
Pro:
Contro: