Storia della domanda
Con l'introduzione del .NET Framework, Visual Basic ha ricevuto una struttura di archiviazione tipo-sicura e veloce per coppie chiave-valore — Dictionary(Of TKey, TValue). Questo è un contenitore associativo standard per la ricerca veloce.
Problema
Lavorare con il dizionario porta spesso a errori: tentare di accedere a un valore tramite una chiave che non esiste provoca un'eccezione. Inoltre, si confondono frequentemente le operazioni di aggiunta, modifica e aggiunta di nuovi valori.
Soluzione
Per accedere ai valori si utilizzano l'indice o i metodi TryGetValue, ContainsKey. Per evitare l'eccezione KeyNotFoundException, controlla sempre esplicitamente:
Esempio di codice:
Dim dict As New Dictionary(Of String, Integer)() dict.Add("one", 1) dict("two") = 2 ' Aggiunta di una nuova coppia If dict.ContainsKey("three") Then Console.WriteLine(dict("three")) ' Non genererà errore Else Console.WriteLine("Chiave non trovata") End If Dim value As Integer = 0 If dict.TryGetValue("one", value) Then Console.WriteLine(value) End If
Caratteristiche chiave:
È vero che dict("chiave") aggiunge sempre una nuova coppia chiave-valore?
No. Se la chiave esiste, il valore viene aggiornato. Se non esiste — la coppia viene aggiunta. Per aggiungere con errore se la chiave esiste — utilizzare Add.
Throwà TryGetValue un'eccezione se la chiave non esiste?
No. Restituisce False senza sollevare un'eccezione e non modifica value. È un modo sicuro di accesso.
È possibile memorizzare in Dictionary tipi valore (ad esempio, Integer) come TValue e ricevere null per chiave assente?
No. Per i tipi valore ritorna il valore predefinito per il tipo (0 per Integer), ma l'accesso tramite indice solleverà comunque un'eccezione in assenza di chiave.
Accesso al dizionario per indice senza controllo preventivo si ripete in vari punti — crash periodici del programma.
Pro:
Contro:
Ampio utilizzo di TryGetValue, tutti gli accessi sono protetti, i casi di assenza di chiave vengono gestiti logicamente.
Pro:
Contro: