ProgrammatieBackend-ontwikkelaar (Visual Basic)

Hoe implementeer je dictionaries (Dictionary(Of TKey, TValue)) in Visual Basic, welke operaties zijn beschikbaar en welke valkuilen zijn er bij het verkrijgen van waarden via een niet-bestaande sleutel?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Achtergrond

Met de komst van .NET Framework heeft Visual Basic een type-veilige en snelle structuur voor het opslaan van sleutel-waarde paren gekregen — Dictionary(Of TKey, TValue). Dit is de standaard associatieve container voor snelle opzoekingen.

Probleem

Werken met een dictionary leidt vaak tot fouten: het proberen te benaderen van een waarde via een sleutel die niet bestaat, leidt tot een uitzondering. Ook zijn er vaak verwarringen over de operaties voor het toevoegen, wijzigen en toevoegen van nieuwe waarden.

Oplossing

Voor het toegang krijgen tot waarden worden de indexator of de methoden TryGetValue, ContainsKey gebruikt. Om de uitzondering KeyNotFoundException te vermijden, doe altijd een expliciete controle:

Codevoorbeeld:

Dim dict As New Dictionary(Of String, Integer)() dict.Add("one", 1) dict("two") = 2 ' Voeg een nieuw paar toe If dict.ContainsKey("three") Then Console.WriteLine(dict("three")) ' Zal geen fout veroorzaken Else Console.WriteLine("Sleutel niet gevonden") End If Dim value As Integer = 0 If dict.TryGetValue("one", value) Then Console.WriteLine(value) End If

Belangrijke kenmerken:

  • Snelle toegang via sleutel (hashing)
  • Expliciete controle van het bestaan van de sleutel voorkomt fout
  • Verwijderen en vervangen van waarden via sleutel wordt gerealiseerd via Remove en de indexator

Valkuil vragen.

Is het waar dat dict("sleutel") altijd een nieuw sleutel-waarde paar toevoegt?

Nee. Als de sleutel bestaat, wordt de waarde bijgewerkt. Als deze niet bestaat, wordt het paar toegevoegd. Voor toevoeging met een fout bij het bestaan van de sleutel, gebruik Add.

Zal TryGetValue een uitzondering opwerpen als de sleutel niet bestaat?

Nee. Het retourneert False, zonder een uitzondering te veroorzaken en verandert de value niet. Dit is een veilige manier om toegang te krijgen.

Kun je in Dictionary waarde-types (bijvoorbeeld, Integer) als TValue opslaan en tegelijkertijd null krijgen voor een niet-bestaande sleutel?

Nee. Voor waarde-types wordt de standaardwaarde voor het type geretourneerd (0 voor Integer), maar toegang via de indexator zal nog steeds een uitzondering opwerpen bij afwezigheid van de sleutel.

Veelvoorkomende fouten en anti-patterns

  • Toegang tot een niet-bestaande sleutel via de indexator zonder controle
  • Dubbele sleutels door Add (leidt tot ArgumentException)
  • Negeren van de terugkeerwaarde van TryGetValue

Voorbeeld uit het leven

Negatieve case

Toegang tot de dictionary via de index zonder voorafgaande controle leidt tot herhaling op verschillende plaatsen — sporadische crashes van het programma.

Voordelen:

  • Compactere code

Nadelen:

  • Onbetrouwbaarheid van de applicatie, moeilijk om fouten op te sporen

Positieve case

Algemeen gebruik van TryGetValue, alle binnenkomsten zijn beschermd, gevallen van afwezigheid van de sleutel worden logisch afgehandeld.

Voordelen:

  • Betrouwbaar gedrag, geen uitzonderingen

Nadelen:

  • Nodig om out-variabelen voor waarden aan te maken