Historie der Frage
Enums (Enum) in Visual Basic werden verwendet, um die Lesbarkeit und Zuverlässigkeit des Codes zu erhöhen. Enum ermöglicht es, eine Menge benannter Konstanten zu definieren und schafft dadurch eine strenge Menge zulässiger Werte für die Logik des Programms.
Problem
Viele glauben, dass Enum die Werte der Variable vollständig auf eines der aufgelisteten Mitglieder beschränkt. In der Realität speichert eine Enum-Variable jedoch einen ganzzahligen Wert, und es kann jeder für den Basistyp zulässige Wert zugewiesen werden, was zu Fehlern und unerwartetem Verhalten führen kann.
Lösung
In VB.NET ist es nicht verboten, einer Enum-Variablen einen nicht im Aufzählungsliste definierten Wert zuzuweisen. Für die sichere Iteration über die Werte wird die Funktion System.Enum.GetValues verwendet. Die Kontrolle der Korrektheit der Werte erfolgt durch zusätzliche Überprüfungen.
Beispielcode:
Enum Colors Red = 1 Green = 2 Blue = 3 End Enum Dim c As Colors = CType(4, Colors) ' Dies wird keinen Kompilierungsfehler verursachen! For Each value As Colors In [Enum].GetValues(GetType(Colors)) Console.WriteLine(value) Next ' Überprüfung If [Enum].IsDefined(GetType(Colors), c) Then Console.WriteLine("OK") Else Console.WriteLine("Inkorrekter Wert!") End If
Wesentliche Merkmale:
Kann man garantieren, dass eine Enum-Variable immer nur deklarierte Werte enthält?
Nein. Auf der Sprachebene ist Enum eine erleichterte Hülle um den grundlegenden numerischen Typ. Die Überprüfung der Zulässigkeit bestimmter Werte muss immer explizit über IsDefined erfolgen.
Ist es möglich, die string-Darstellung von Enum anhand seines Wertes zu erhalten, auch wenn dieser nicht deklariert ist?
Ja. Die Methode ToString für Enum, das mit einem nicht vorhandenen Wert zugewiesen wurde, gibt diesen numerischen Äquivalent als String aus: Zum Beispiel wird für Colors = 4 das Ergebnis "4" sein.
Was passiert, wenn man alle Werte mit Enum.GetValues auflistet und dann einer Enum-Variable eine Zahl außerhalb der Aufzählung zuweist?
Die Iteration über GetValues gibt nur die deklarierten Mitglieder zurück, während die Enum-Variable trotzdem eine beliebige Zahl außerhalb des Bereichs enthalten kann — dies wird zu einem logischen Fehler, jedoch nicht zu einem Syntaxfehler.
Eingaben von der Konsole werden direkt in eine Enum konvertiert, ohne Validierung — wir erhalten inkorrekte Werte und einen Anwendungsabsturz in späteren Phasen.
Vorteile:
Nachteile:
Benutzerwerte werden zunächst über Enum.IsDefined validiert, die Verarbeitung ist auch für falsche Daten korrekt.
Vorteile:
Nachteile: