Historia pytania
Wyliczenia (Enum) w Visual Basic są używane do zwiększenia czytelności i niezawodności kodu. Enum pozwala definiować zbiór nazwanych stałych, tworząc surowy zestaw dozwolonych wartości dla logiki programu.
Problem
Wielu uważa, że Enum całkowicie ogranicza wartości zmiennej do jednego z wyliczonych członów. Jednak w rzeczywistości zmienna Enum przechowuje wartość typu całkowitego i można jej przypisać dowolną dozwoloną wartość dla podstawowego typu, co może prowadzić do błędów i nieoczekiwanego zachowania.
Rozwiązanie
W VB.NET nie zabrania się przypisywania zmiennej Enum wartości, która nie jest określona na liście. Aby bezpiecznie iterować przez wartości, używa się funkcji System.Enum.GetValues. Kontrola poprawności wartości jest zapewniana przez dodatkowe weryfikacje.
Przykład kodu:
Enum Kolory Czerwony = 1 Zielony = 2 Niebieski = 3 End Enum Dim c As Kolory = CType(4, Kolory) ' To nie będzie błędem kompilacji! For Each value As Kolory In [Enum].GetValues(GetType(Kolory)) Console.WriteLine(value) Next ' Sprawdzenie If [Enum].IsDefined(GetType(Kolory), c) Then Console.WriteLine("OK") Else Console.WriteLine("Niepoprawna wartość!") End If
Kluczowe cechy:
Czy można zagwarantować, że zmienna Enum zawsze zawiera tylko zadeklarowane wartości?
Nie. Na poziomie języka Enum to uproszczony wrapper nad podstawowym typem liczbowym. Weryfikację dozwoloności konkretnych wartości zawsze należy wykonywać jawnie przez IsDefined.
Czy możliwe jest uzyskanie reprezentacji tekstowej Enum na podstawie jego wartości, nawet jeśli nie jest ona zadeklarowana?
Tak. Metoda ToString dla Enum, przypisanego do nieistniejącej wartości, zwróci ten numeryczny odpowiednik w postaci łańcucha: np. dla Kolory = 4 wynik będzie "4".
Co się stanie, jeśli zliczymy wszystkie wartości przez Enum.GetValues, a następnie przypiszemy zmiennej Enum liczbę poza wykazem?
Iteracja GetValues zwróci tylko zadeklarowane człony, a zmienna Enum nadal może zawierać dowolną liczbę poza zakresem — stanie się to błędem logicznym, a nie syntaktycznym.
Dane wejściowe z ekranu są konwertowane bezpośrednio do Enum bez walidacji — otrzymujemy niepoprawne wartości i awarię aplikacji na kolejnych etapach.
Zalety:
Wady:
Wartość użytkownika jest najpierw walidowana przez Enum.IsDefined, przetwarzanie jest poprawne nawet dla błędnych danych.
Zalety:
Wady: