Achtergrond van de vraag
Enumeraties (Enum) in Visual Basic worden gebruikt om de leesbaarheid en betrouwbaarheid van de code te verbeteren. Enum stelt je in staat om een set benoemde constanten te definiëren, waardoor een strikte set geldige waarden voor de logica van het programma wordt gecreëerd.
Probleem
Veel mensen denken dat Enum de waarden van de variabele volledig beperkt tot een van de opgesomde leden. In werkelijkheid slaat een Enum-variabele echter een geheel getal op, en kan deze elke geldige waarde van het basistype krijgen, wat kan leiden tot fouten en onverwacht gedrag.
Oplossing
In VB.NET is het niet verboden om een Enum-variabele een waarde toe te wijzen die niet in de lijst staat. Voor veilige iteratie over waarden gebruiken we de functie System.Enum.GetValues. De controle op geldigheid wordt verzekerd door extra controles.
Voorbeeldcode:
Enum Kleuren Rood = 1 Groen = 2 Blauw = 3 End Enum Dim c As Kleuren = CType(4, Kleuren) ' Dit zal geen compileerfout zijn! For Each value As Kleuren In [Enum].GetValues(GetType(Kleuren)) Console.WriteLine(value) Next ' Controle If [Enum].IsDefined(GetType(Kleuren), c) Then Console.WriteLine("OK") Else Console.WriteLine("Ongeldige waarde!") End If
Belangrijke kenmerken:
Kan worden gegarandeerd dat een Enum-variabele altijd alleen de gedeclareerde waarden bevat?
Nee. Op taalniveau is Enum een vereenvoudigde wrapper rond een basaal numeriek type. De controle op de geldigheid van specifieke waarden moet altijd expliciet worden gedaan via IsDefined.
Is het mogelijk om een stringrepresentatie van Enum op te halen op basis van zijn waarde, zelfs als deze niet is gedeclareerd?
Ja. De ToString-methode voor een Enum die een niet-bestaande waarde toegewezen krijgt, geeft deze numerieke equivalent als string: bijvoorbeeld, voor Kleuren = 4 zal het resultaat "4" zijn.
Wat gebeurt er als we alle waarden itereren via Enum.GetValues en vervolgens een nummer buiten de opsomming aan een Enum-variabele toewijzen?
De iteratie van GetValues retourneert alleen de gedeclareerde leden, terwijl de Enum-variabele toch een willekeurig getal buiten het bereik kan bevatten — dit wordt een logische fout, geen syntactische.
Invoer vanaf het scherm wordt rechtstreeks geconverteerd naar Enum zonder validatie, — met ongeldige waarden en een crash van de applicatie in latere stadia.
Voordelen:
Nadelen:
Gebruikerswaarde wordt eerst gevalideerd via Enum.IsDefined, verwerking is correct, zelfs voor onjuiste gegevens.
Voordelen:
Nadelen: