In Visual Basic, le collezioni (array, liste, dizionari, ecc.) supportano l'accesso sia tramite indice che tramite iteratori (ad esempio, tramite For Each). Nella storia del linguaggio, il primo elemento di un array standard aveva indice 0, tuttavia, per motivi di compatibilità con VB6, esistono array dichiarati con 1. Ciò influisce sull'ordine di accesso e sulle possibili errori. Inoltre, le collezioni di tipo Dictionary supportano la ricerca per chiave, ma tentare di accedere a un elemento inesistente può portare a un'eccezione.
Il problema di accesso risiede nelle differenze di sintassi, nelle peculiarità dell'uso degli indicizzatori e nel fatto che non tutte le collezioni restituiscono Null o Nothing in caso di assenza di un elemento — spesso si verifica un'eccezione. Nell'uso dei cicli, è importante rispettare l'intervallo degli indici e controllare preventivamente la dimensione della collezione.
Una soluzione per un accesso sicuro include il controllo della lunghezza, l'uso dei metodi ContainsKey o TryGetValue per i dizionari, così come l'iterazione degli elementi tramite For Each, dove l'accesso avviene a valori esistenti senza rischiare di uscire dai limiti.
Esempio di codice:
Dim list As New List(Of String)({"a", "b", "c"}) For i As Integer = 0 To list.Count - 1 Console.WriteLine(list(i)) Next ' Iterazione tramite iteratore: For Each item In list Console.WriteLine(item) Next ' Accesso sicuro in Dictionary Dim dict As New Dictionary(Of Integer, String) dict(1) = "one" If dict.ContainsKey(2) Then Console.WriteLine(dict(2)) End If
Caratteristiche chiave:
È possibile accedere a Dictionary tramite indice come un array?
No, Dictionary non supporta l'accesso tramite indice numerico, solo tramite chiave. Per iterare le chiavi in ordine, è necessario ottenere la collezione delle chiavi:
For Each key In dict.Keys Console.WriteLine(dict(key)) Next
Cosa succede se si accede a List tramite indice al di fuori dell'intervallo?
Verrà sollevata un'eccezione ArgumentOutOfRangeException. Controllare sempre che l'indice sia minore di Count e maggiore o uguale a 0.
Può For Each saltare elementi se la collezione viene modificata durante l'iterazione?
Sì, modificare la collezione all'interno di For Each provoca un'eccezione InvalidOperationException. Evitare di aggiungere o rimuovere elementi durante l'iterazione:
' Esempio di errore For Each x In list list.Remove(x) ' Solleverà un'eccezione Next
I principianti aggiungevano elementi a List all'interno di un ciclo For Each, risultando in un'app che si bloccava con un'eccezione InvalidOperationException.
Pro:
Prima di iniziare l'iterazione, salvare l'elenco degli elementi in un array separato, lavorare con una copia, o utilizzare For con indice. Accesso a Dictionary solo dopo aver verificato l'esistenza della chiave.
Pro: