В Visual Basic перечисления (Enum) используются для объявления именованных целочисленных констант, что повышает читаемость и удобство поддержки кода. Объявляются перечисления следующим образом:
Public Enum StatusCode Success = 0 Warning = 1 Error = 2 End Enum
Важные нюансы:
Пример использования:
Dim code As StatusCode = StatusCode.Success If code = StatusCode.Error Then Console.WriteLine("Ошибка!") End If ' Присваивание несуществующего значения code = CType(5, StatusCode) ' Это скомпилируется, но значение не определено в Enum
Можно ли присвоить переменной типа Enum значение, которого нет среди перечисленных в Enum? Чем это может закончиться?
Да, в Visual Basic (и .NET в целом) переменной Enum можно присвоить любое подходящее (по базовому типу) числовое значение через явное преобразование (
CType,DirectCast). Это не вызовет ошибки компиляции, но приведёт к потенциальным проблемам при дальнейшем использовании, поскольку такие значения не отображаются на названия элементов Enum и их не получится корректно разобрать через методы типа ToString. Например:
Dim code As StatusCode = CType(42, StatusCode) Console.WriteLine(code) ' выведет '42', а не имя элемента Enum
История
В одном крупном проекте разработчики через WebAPI передавали статусы как int, а на стороне клиента преобразовывали их в Enum. При появлении новых значений, не добавленных в Enum, приложение не показывало корректную информацию, т.к. отсутствовали проверки на "валидность" значения Enum.
История
Использование Enum без Option Strict приводило к тому, что случайные числовые значения, получаемые из внешних источников, неявно приводились к Enum, провоцируя баги в бизнес-логике, которые сложно отследить в рантайме.
История
Отсутствие явного указания базового типа Enum (например, Byte для экономии памяти) привело к неожиданному переполнению целого типа в узком микроконтроллерном решении на Compact Framework.