Storia della domanda:
In VB.NET, la classe Dictionary(Of TKey, TValue) è diventata uno standard riconosciuto per la memorizzazione associativa dei dati (chiave-valore). Nel classico VB6, si usava più frequentemente l'oggetto Scripting.Dictionary o la collezione Collection, così come il tipo Hashtable, apparso nelle prime versioni di .NET. Queste strutture consentono di trovare rapidamente i valori per chiave e hanno sostituito approcci meno sicuri dal punto di vista dei tipi.
Problema
La differenza non evidente tra Dictionary e Hashtable — e gli errori possibili nel cercare una chiave assente. Ad esempio, tentare di accedere a una chiave che non esiste genera un'eccezione in alcuni casi e non in altri. Inoltre, le differenze nella sicurezza dei tipi e nelle prestazioni portano a scelte errate della collezione.
Soluzione
Nelle versioni moderne di VB.NET, la migliore pratica è considerare l'uso del Dictionary(Of TKey, TValue), dove TKey e TValue sono strettamente tipizzati:
Dim dict As New Dictionary(Of String, Integer)() dict.Add("apple", 1) dict.Add("banana", 2) If dict.ContainsKey("banana") Then Console.WriteLine(dict("banana")) ' Mostrerà 2 End If ' Accesso sicuro al valore Dim value As Integer If dict.TryGetValue("cherry", value) Then Console.WriteLine(value) Else Console.WriteLine("Chiave non trovata!") End If
Caratteristiche chiave:
Si può usare Object come chiave senza limiti in Dictionary?
Formalmente sì, ma è richiesta l'implementazione corretta dei metodi GetHashCode e Equals nella classe che funge da chiave. Altrimenti si possono verificare collisioni ed errori di ricerca.
Cosa succede se si accede a una chiave non esistente tramite dict("foo")?
Verrà generata un'eccezione KeyNotFoundException. Senza controllo preliminare della chiave (tramite ContainsKey o TryGetValue), il programma si fermerà.
Dictionary e Hashtable supportano lo stesso ordine degli elementi?
No. Entrambe le classi non garantiscono l'ordine di aggiunta degli elementi. Per mantenere l'ordine, usa SortedDictionary, OrderedDictionary o altre strutture.
Un sviluppatore ha scelto Hashtable per memorizzare grandi volumi di dati utente. Si sono verificate difficoltà di debug — la stessa chiave non è sempre coincisa, si sono presentati errori Object.ReferenceEquals, legati a un tipo di chiave instabile.
Pro:
Contro:
Si è passati a Dictionary(Of Guid, User): tipizzazione rigorosa, supporto per TryGetValue, eliminate le collisioni. Le prestazioni sono aumentate.
Pro:
Contro: