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:
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.
Toegang tot de dictionary via de index zonder voorafgaande controle leidt tot herhaling op verschillende plaatsen — sporadische crashes van het programma.
Voordelen:
Nadelen:
Algemeen gebruik van TryGetValue, alle binnenkomsten zijn beschermd, gevallen van afwezigheid van de sleutel worden logisch afgehandeld.
Voordelen:
Nadelen: