In Visual Basic werden Enumerationen (Enum) verwendet, um benannte ganzzahlige Konstanten zu deklarieren, was die Lesbarkeit und Wartbarkeit des Codes erhöht. Enumerationen werden wie folgt deklariert:
Public Enum StatusCode Success = 0 Warning = 1 Error = 2 End Enum
Wichtige Nuancen:
Beispielverwendung:
Dim code As StatusCode = StatusCode.Success If code = StatusCode.Error Then Console.WriteLine("Fehler!") End If ' Zuweisung eines nicht existierenden Wertes code = CType(5, StatusCode) ' Dies kompiliert, aber der Wert ist in Enum nicht definiert
Ist es möglich, einer Enum-Variablen einen Wert zuzuweisen, der nicht unter den in der Enum aufgeführten Werten vorhanden ist? Wie kann das enden?
Ja, in Visual Basic (und .NET im Allgemeinen) kann einer Enum-Variablen jeder geeignete (nach Basistyp) numerische Wert durch explizite Umwandlung (
CType,DirectCast) zugewiesen werden. Dies führt nicht zu einem Kompilierungsfehler, kann aber zu potenziellen Problemen bei der weiteren Verwendung führen, da solche Werte nicht den Namen der Enum-Elemente widerspiegeln und nicht korrekt über Methoden wie ToString interpretiert werden können. Zum Beispiel:
Dim code As StatusCode = CType(42, StatusCode) Console.WriteLine(code) ' gibt '42' aus, nicht den Namen des Enum-Elements
Geschichte
In einem großen Projekt übertrugen Entwickler Statuswerte über WebAPI als int, und auf der Clientseite wurden sie in Enum umgewandelt. Bei neuen Werten, die nicht in Enum hinzugefügt wurden, zeigte die Anwendung keine korrekten Informationen an, da es an Prüfungen zur "Gültigkeit" des Enum-Wertes fehlte.
Geschichte
Die Verwendung von Enum ohne Option Strict führte dazu, dass zufällige numerische Werte, die aus externen Quellen stammten, implizit in Enum umgewandelt wurden, was Bugs in der Geschäftslogik verursachte, die zur Laufzeit nur schwer zurückzuverfolgen waren.
Geschichte
Das Fehlen einer ausdrücklichen Angabe des zugrunde liegenden Typs von Enum (z.B. Byte zur Einsparung von Speicher) führte zu unerwarteten Überläufen des gesamten Typs in einer engen Mikrocontrollerlösung auf dem Compact Framework.