ProgrammierungBackend-Entwickler (VB.NET)

Wie wird in Visual Basic ein Dictionary mit beliebigen Schlüsseln (Dictionary) erstellt und verwendet, was ist der Unterschied zwischen Dictionary und Hashtable und was sind die Besonderheiten bei der Arbeit mit fehlenden Schlüsseln?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

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:

  • Dictionary(Of TKey, TValue) arbeitet schneller, ist standardmäßig typsicher und erlaubt beliebige Schlüssel (sofern GetHashCode/Equals korrekt implementiert sind).
  • Hashtable akzeptiert und gibt Object zurück, unterstützt keine Generics, ist langsamer und weniger komfortabel in modernem Code.
  • Der Zugriff auf einen fehlenden Schlüssel über das Dictionary wirft eine KeyNotFoundException aus. Verwenden Sie ContainsKey oder TryGetValue für einen sicheren Zugriff.

Fangfragen.

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.

Typische Fehler und Anti-Patterns

  • Zugriff auf Werte des Dictionaries ohne Überprüfung des Vorhandenseins des Schlüssels.
  • Verwendung von Hashtable in modernem Code ohne dringende Notwendigkeit – fehlende Typsicherheit.
  • Verwendung von Objekten mit instabilen Hash-Codes als Schlüssel (z. B. veränderbare Objekte).

Beispiel aus der Praxis

Negativer Fall

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:

  • Schnelles Prototyping, minimal funktionsfähige Lösung.

Nachteile:

  • Schwer zu debuggen.
  • Sammlung von "Object"-Typen – schwer Fehler im Typ zu verfolgen.
  • TryGetValue funktioniert nicht.

Positiver Fall

Wechsel zu Dictionary(Of Guid, User): strenge Typisierung, Unterstützung von TryGetValue, Ausschluss von Kollisionsfehlern. Die Leistung verbesserte sich.

Vorteile:

  • Vorhersehbares Verhalten.
  • Keine Typfehler, weniger Zeitaufwand für das Debugging.

Nachteile:

  • Es muss ein korrekter GetHashCode/Equals implementiert werden, wenn ein benutzerdefinierter Schlüsseltyp verwendet wird.