Hintergrund:
In VB.NET ist die Klasse Dictionary(Of TKey, TValue) der Standard für die associative Speicherung von Daten (Schlüssel-Wert). Im klassischen VB6 wurde oft das Objekt Scripting.Dictionary oder die Collection-Sammlung sowie der in früheren Versionen von .NET eingeführte Typ Hashtable verwendet. Diese Strukturen ermöglichen eine schnelle Suche nach Werten basierend auf dem Schlüssel und ersetzen weniger typsichere Ansätze.
Problem
Ein weniger offensichtlicher Unterschied zwischen Dictionary und Hashtable ist die Möglichkeit von Fehlern beim Suchen nach einem fehlenden Schlüssel. Zum Beispiel führt der Versuch, auf einen Schlüssel zuzugreifen, der nicht vorhanden ist, in einigen Fällen zu einem Fehler und in anderen nicht. Auch die Unterschiede in der Typsicherheit und der Leistung führen zu einer falschen Wahl der Sammlung.
Lösung
In modernen Versionen von VB.NET gilt es als Best Practice, Dictionary(Of TKey, TValue) zu verwenden, wobei TKey und TValue strikt typisiert sind:
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")) ' Gibt 2 aus End If ' Sichere Abfrage des Wertes Dim value As Integer If dict.TryGetValue("cherry", value) Then Console.WriteLine(value) Else Console.WriteLine("Dieser Schlüssel existiert nicht!") End If
Wichtige Merkmale:
Kann man Object ohne Einschränkungen als Schlüssel im Dictionary verwenden?
Formal ja, aber es ist eine korrekte Implementierung der Methoden GetHashCode und Equals der Klasse erforderlich, die als Schlüssel dient. Andernfalls können Kollisionen und Suchfehler auftreten.
Was passiert, wenn man auf einen nicht vorhandenen Schlüssel über dict("foo") zugreift?
Es wird eine KeyNotFoundException ausgelöst. Ohne vorherige Überprüfung des Schlüssels (über ContainsKey oder TryGetValue) wird das Programm abstürzen.
Unterstützen Dictionary und Hashtable die gleiche Reihenfolge von Elementen?
Nein. Beide Klassen garantieren nicht die Reihenfolge, in der Elemente hinzugefügt werden. Verwenden Sie SortedDictionary, OrderedDictionary oder andere Strukturen, um die Reihenfolge beizubehalten.
Der Entwickler wählte Hashtable zur Speicherung großer Mengen von Benutzerdaten. Es traten schwer nachvollziehbare Fehler auf – derselbe Schlüssel stimmte nicht immer überein, in Tests traten Object.ReferenceEquals-Fehler auf, ein instabiler Schlüsseltyp wurde verwendet.
Vorteile:
Nachteile:
Wechsel zu Dictionary(Of Guid, User): strenge Typisierung, Unterstützung von TryGetValue, Ausschluss von Kollisionsfehlern. Die Leistung verbesserte sich.
Vorteile:
Nachteile: