Оператор Enum (Visual Basic)
Объявляет перечисление и определяет значения его членов.
Синтаксис
[ <attributelist> ] [ accessmodifier ] [ Shadows ]
Enum enumerationname [ As datatype ]
memberlist
End Enum
Детали
attributelist
Необязательно. Список атрибутов, применяемых к этому перечислению. Необходимо заключить список атрибутов в угловые скобки ("
<
" и ">
").Атрибут FlagsAttribute указывает, что значение экземпляра перечисления может включать несколько элементов перечисления, а каждый элемент представляет битовое поле в значении перечисления.
accessmodifier
Необязательно. Указывает, какой код может получить доступ к этому перечислению. Может применяться один из перечисленных ниже типов.
Shadows
Необязательно. Указывает, что это перечисление повторно используется и скрывает идентичный именованный элемент программирования или набор перегруженных элементов в базовом классе. Вы можете указать тени только в самом перечислении, а не на каких-либо его членах.
enumerationname
Обязательный. Имя перечисления. Сведения о допустимых именах см. в разделе "Объявленные имена элементов".
datatype
Необязательно. Тип данных перечисления и всех его членов.
memberlist
Обязательный. Список констант членов, объявленных в этом операторе. Несколько элементов отображаются в отдельных строках исходного кода.
Каждый
member
из них имеет следующий синтаксис и части:[<attribute list>] member name [ = initializer ]
Часть Description membername
Обязательное. Имя этого члена. initializer
Необязательно. Выражение, вычисляемое во время компиляции и назначенное этому элементу. End
Enum
Завершает блок
Enum
.
Замечания
Если у вас есть набор изменяющихся значений, которые логически связаны друг с другом, их можно определить вместе в перечислении. Это обеспечивает значимые имена перечисления и его членов, которые проще запоминать, чем их значения. Затем можно использовать элементы перечисления во многих местах в коде.
Ниже приведены преимущества использования перечислений:
Уменьшает ошибки, вызванные транспонированием или неправильным числом.
упрощает изменение значений в будущем;
Упрощает чтение кода, что означает, что вероятность появления ошибок будет меньше.
обеспечивает прямую совместимость. Если вы используете перечисления, ваш код, скорее всего, завершится ошибкой, если в будущем кто-то изменяет значения, соответствующие именам элементов.
Перечисление имеет имя, базовый тип данных и набор элементов. Каждый элемент представляет константу.
Перечисление, объявленное на уровне класса, структуры, модуля или интерфейса вне любой процедуры, является перечислением элементов. Он является членом класса, структуры, модуля или интерфейса, который объявляет его.
Перечисления членов можно получить из любого места в пределах класса, структуры, модуля или интерфейса. Код вне класса, структуры или модуля должен квалифицировать имя перечисления элементов с именем этого класса, структуры или модуля. Вы можете избежать необходимости использовать полные имена, добавив инструкцию Import в исходный файл.
Перечисление, объявленное на уровне пространства имен, за пределами любого класса, структуры, модуля или интерфейса, является членом пространства имен, в котором он отображается.
Контекст объявления для перечисления должен быть исходным файлом, пространством имен, классом, структурой, модулем или интерфейсом и не может быть процедурой. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.
Атрибуты можно применять к перечислению в целом, но не к его членам по отдельности. Атрибут вносит сведения в метаданные сборки.
Тип данных
Инструкция Enum
может объявить тип данных перечисления. Каждый элемент принимает тип данных перечисления. Можно указать Byte
, Integer
, Long
SByte
UInteger
Short
или . ULong
UShort
Если для перечисления не указано datatype
, каждый элемент принимает тип данных его initializer
. Если указано и то datatype
, и initializer
другое initializer
, тип данных должен быть преобразован в datatype
. Если ни нет datatype
initializer
, тип данных по умолчанию не указан Integer
.
Инициализация элементов
Инструкция Enum
может инициализировать содержимое выбранных элементов в memberlist
. Вы используете initializer
для предоставления выражения, назначаемого элементу.
Если элемент не указан initializer
, Visual Basic инициализирует его либо до нуля (если это первое member
в memberlist
), либо значение, большее по одному из указанных выше member
.
Выражение, указанное в каждом initializer
из них, может быть любым сочетанием литерала, других констант, которые уже определены, и элементов перечисления, которые уже определены, включая предыдущий член этого перечисления. Для объединения таких элементов можно использовать арифметические и логические операторы.
Нельзя использовать переменные или функции в initializer
. Однако можно использовать ключевые слова преобразования, такие как CByte
и CShort
. Можно также использовать AscW
при вызове его с константой String
или Char
аргументом, так как это можно оценить во время компиляции.
Перечисления не могут иметь значения с плавающей запятой. Если член назначается значение с плавающей запятой и Option Strict
имеет значение on, возникает ошибка компилятора. Если Option Strict
значение отключено, значение автоматически преобразуется в Enum
тип.
Если значение элемента превышает допустимый диапазон для базового типа данных или если инициализировать любой элемент до максимального значения, допустимого базовым типом данных, компилятор сообщает об ошибке.
Модификаторы
Перечисления элементов класса, структуры, модуля и интерфейса по умолчанию доступны для общедоступного доступа. Уровни доступа можно настроить с помощью модификаторов доступа. Перечисления элементов пространства имен по умолчанию доступны для друга. Уровни доступа можно настроить на общедоступные, но не на закрытые или защищенные. Дополнительные сведения см. в разделе "Уровни доступа" в Visual Basic.
Все члены перечисления имеют открытый доступ, и в них нельзя использовать модификаторы доступа. Однако если сам перечисление имеет более ограниченный уровень доступа, указанный уровень доступа перечисления имеет приоритет.
По умолчанию все перечисления являются типами и их полями являются константами. Поэтому ключевые Shared
Static
слова и ReadOnly
ключевые слова нельзя использовать при объявлении перечисления или его членов.
Назначение нескольких значений
Перечисления обычно представляют взаимоисключающие значения. Включив FlagsAttribute атрибут в Enum
объявление, можно вместо этого назначить несколько значений экземпляру перечисления. Атрибут FlagsAttribute указывает, что перечисление обрабатывается как битовое поле, то есть набор флагов. Они называются битовой перечислением .
При объявлении перечисления с помощью атрибута FlagsAttribute рекомендуется использовать полномочия 2, то есть 1, 2, 4, 8, 16 и т. д. для значений. Мы также рекомендуем использовать "None" в имени члена, значение которого равно 0. Дополнительные рекомендации см FlagsAttribute . и Enum.
Пример 1
В следующем примере показано использование оператора Enum
. Обратите внимание, что член называется EggSizeEnum.Medium
,а не как Medium
.
Public Class Egg
Enum EggSizeEnum
Jumbo
ExtraLarge
Large
Medium
Small
End Enum
Public Sub Poach()
Dim size As EggSizeEnum
size = EggSizeEnum.Medium
' Continue processing...
End Sub
End Class
Пример 2
Метод в следующем примере находится за пределами Egg
класса. Таким образом, EggSizeEnum
полностью соответствует Egg.EggSizeEnum
требованиям.
Public Sub Scramble(ByVal size As Egg.EggSizeEnum)
' Process for the three largest sizes.
' Throw an exception for any other size.
Select Case size
Case Egg.EggSizeEnum.Jumbo
' Process.
Case Egg.EggSizeEnum.ExtraLarge
' Process.
Case Egg.EggSizeEnum.Large
' Process.
Case Else
Throw New ApplicationException("size is invalid: " & size.ToString)
End Select
End Sub
Пример 3
В следующем примере оператор используется Enum
для определения связанного набора именованных констант. В этом случае значения — это цвета, которые можно выбрать для разработки форм записи данных для базы данных.
Public Enum InterfaceColors
MistyRose = &HE1E4FF&
SlateGray = &H908070&
DodgerBlue = &HFF901E&
DeepSkyBlue = &HFFBF00&
SpringGreen = &H7FFF00&
ForestGreen = &H228B22&
Goldenrod = &H20A5DA&
Firebrick = &H2222B2&
End Enum
Пример 4
В следующем примере показаны значения, включающие как положительные, так и отрицательные числа.
Enum SecurityLevel
IllegalEntry = -1
MinimumSecurity = 0
MaximumSecurity = 1
End Enum
Пример 5
В следующем примере As
предложение используется для указания datatype
перечисления.
Public Enum MyEnum As Byte
Zero
One
Two
End Enum
Пример 6
В следующем примере показано, как использовать побитовое перечисление. Несколько значений можно назначить экземпляру побитового перечисления. Объявление Enum
включает FlagsAttribute атрибут, который указывает, что перечисление можно рассматривать как набор флагов.
' Apply the Flags attribute, which allows an instance
' of the enumeration to have multiple values.
<Flags()> Public Enum FilePermissions As Integer
None = 0
Create = 1
Read = 2
Update = 4
Delete = 8
End Enum
Public Sub ShowBitwiseEnum()
' Declare the non-exclusive enumeration object and
' set it to multiple values.
Dim perm As FilePermissions
perm = FilePermissions.Read Or FilePermissions.Update
' Show the values in the enumeration object.
Console.WriteLine(perm.ToString)
' Output: Read, Update
' Show the total integer value of all values
' in the enumeration object.
Console.WriteLine(CInt(perm))
' Output: 6
' Show whether the enumeration object contains
' the specified flag.
Console.WriteLine(perm.HasFlag(FilePermissions.Update))
' Output: True
End Sub
Пример 7
В следующем примере выполняется итерирование перечисления. Он использует GetNames метод для получения массива имен элементов из перечисления и GetValues получения массива значений элементов.
Enum EggSizeEnum
Jumbo
ExtraLarge
Large
Medium
Small
End Enum
Public Sub Iterate()
Dim names = [Enum].GetNames(GetType(EggSizeEnum))
For Each name In names
Console.Write(name & " ")
Next
Console.WriteLine()
' Output: Jumbo ExtraLarge Large Medium Small
Dim values = [Enum].GetValues(GetType(EggSizeEnum))
For Each value In values
Console.Write(value & " ")
Next
Console.WriteLine()
' Output: 0 1 2 3 4
End Sub