W Visual Basic wyliczenia (Enum) służą do deklarowania nazwanych stałych całkowitych, co zwiększa czytelność i ułatwia utrzymanie kodu. Wyliczenia deklaruje się w następujący sposób:
Public Enum StatusCode Success = 0 Warning = 1 Error = 2 End Enum
Ważne niuanse:
Przykład użycia:
Dim code As StatusCode = StatusCode.Success If code = StatusCode.Error Then Console.WriteLine("Błąd!") End If ' Przypisanie nieistniejącej wartości code = CType(5, StatusCode) ' To skompiluje się, ale wartość nie jest zdefiniowana w Enum
Czy można przypisać zmiennej typu Enum wartość, której nie ma wśród wymienionych w Enum? Jakie mogą być tego konsekwencje?
Tak, w Visual Basic (i .NET w ogóle) zmiennej Enum można przypisać dowolną odpowiednią (po typie bazowym) wartość numeryczną przez jawne rzutowanie (
CType,DirectCast). Nie spowoduje to błędu kompilacji, ale może prowadzić do potencjalnych problemów podczas dalszego użycia, ponieważ takie wartości nie odpowiadają nazwom elementów Enum i nie można ich prawidłowo rozpoznać za pomocą metod typu ToString. Na przykład:
Dim code As StatusCode = CType(42, StatusCode) Console.WriteLine(code) ' wyświetli '42', a nie nazwę elementu Enum
Historia
W jednym dużym projekcie deweloperzy przesyłali statusy przez WebAPI jako int, a po stronie klienta konwertowali je na Enum. W przypadku pojawienia się nowych wartości, które nie zostały dodane do Enum, aplikacja nie wyświetlała poprawnych informacji, ponieważ brakowało kontroli "ważności" wartości Enum.
Historia
Użycie Enum bez Option Strict prowadziło do tego, że przypadkowe wartości numeryczne, otrzymywane z zewnętrznych źródeł, były niejawnie rzutowane na Enum, wywołując błędy w logice biznesowej, które trudno było zlokalizować w czasie działania.
Historia
Brak jawnego określenia typu bazowego Enum (na przykład Byte dla oszczędności pamięci) doprowadził do nieoczekiwanego przepełnienia typu całkowitego w wąskim rozwiązaniu mikroprocesorowym na Compact Framework.