Geschiedenis van de kwestie:
In VB.NET is de class Dictionary(Of TKey, TValue) de duidelijke standaard geworden voor associatieve gegevensopslag (sleutel-waarde). In de klassieke VB6 werd vaak gebruik gemaakt van het object Scripting.Dictionary of de collectie Collection, evenals het type Hashtable, dat in de vroege versies van .NET verscheen. Deze structuren maken het mogelijk om waarden snel op te zoeken op basis van de sleutel en hebben minder type-veilige benaderingen vervangen.
Probleem
Een niet-voor de hand liggend verschil tussen Dictionary en Hashtable — en mogelijke fouten bij het zoeken naar een ontbrekende sleutel. Bijvoorbeeld, het proberen te benaderen van een sleutel die niet bestaat, kan in sommige gevallen een fout veroorzaken en in andere niet. Ook leiden verschillen in type-veiligheid en prestaties tot een verkeerde keuze van collectie.
Oplossing
In de moderne versies van VB.NET wordt het als beste praktijk beschouwd om Dictionary(Of TKey, TValue) te gebruiken, waarbij TKey en TValue strikt getypeerd zijn:
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")) ' Geeft 2 End If ' Veilige toegang tot de waarde Dim value As Integer If dict.TryGetValue("cherry", value) Then Console.WriteLine(value) Else Console.WriteLine("Die sleutel bestaat niet!") End If
Belangrijkste kenmerken:
Kan Object zonder beperkingen als sleutel worden gebruikt in Dictionary?
Formeel ja, maar er is een correcte implementatie van de methoden GetHashCode en Equals vereist voor de class die als sleutel dient. Anders zijn er mogelijke conflicten en zoekfouten.
Wat gebeurt er als je een niet-bestaande sleutel probeert te benaderen via dict("foo")?
Er zal een KeyNotFoundException worden opgegooid. Zonder voorafgaande controle van de sleutel (via ContainsKey of TryGetValue) zal het programma crashen.
Ondersteunen Dictionary en Hashtable dezelfde volgorde van elementen?
Nee. Beide classes garanderen de volgorde van invoegen van elementen niet. Gebruik SortedDictionary, OrderedDictionary of andere structuren om de volgorde te behouden.
Een ontwikkelaar koos Hashtable voor het opslaan van grote hoeveelheden gebruikersdata. Hij ervaarde moeilijk te traceren fouten — dezelfde sleutel kwam niet altijd overeen, in tests kwamen Object.ReferenceEquals fouten naar voren, een onbetrouwbaar type sleutel werd bevestigd.
Voordelen:
Nadelen:
Ze schakelden over naar Dictionary(Of Guid, User): strikte typing, ondersteuning van TryGetValue, conflictfouten uitgesloten. Prestaties zijn verbeterd.
Voordelen:
Nadelen: