ProgrammazioneSviluppatore Backend (Visual Basic)

Come implementare dizionari (Dictionary(Of TKey, TValue)) in Visual Basic, quali operazioni sono disponibili, quali insidie ci sono quando si ottiene un valore con una chiave inesistente?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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:

  • Accesso rapido tramite chiave (hashing)
  • Controllo esplicito della presenza della chiave previene l'errore
  • Cancellazione e sostituzione dei valori tramite chiave sono implementate tramite Remove e indice

Domande trabocchetto.

È 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.

Errori tipici e anti-pattern

  • Accesso a una chiave inesistente tramite indice senza controllo
  • Duplicazione di chiavi tramite Add (porta a ArgumentException)
  • Ignorare il valore di ritorno di TryGetValue

Esempio dalla vita reale

Caso negativo

Accesso al dizionario per indice senza controllo preventivo si ripete in vari punti — crash periodici del programma.

Pro:

  • Codice più compatto

Contro:

  • Instabilità dell'applicazione, difficile gestire errori

Caso positivo

Ampio utilizzo di TryGetValue, tutti gli accessi sono protetti, i casi di assenza di chiave vengono gestiti logicamente.

Pro:

  • Comportamento stabile, nessuna eccezione

Contro:

  • Necessità di creare variabili out per i valori