Оператор 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, LongSByteUIntegerShortили . ULongUShort

Если для перечисления не указано datatype , каждый элемент принимает тип данных его initializer. Если указано и то datatype , и initializerдругое initializer , тип данных должен быть преобразован в datatype. Если ни нет datatypeinitializer , тип данных по умолчанию не указан 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.

Все члены перечисления имеют открытый доступ, и в них нельзя использовать модификаторы доступа. Однако если сам перечисление имеет более ограниченный уровень доступа, указанный уровень доступа перечисления имеет приоритет.

По умолчанию все перечисления являются типами и их полями являются константами. SharedStaticПоэтому при объявлении перечисления или его членов нельзя использовать и 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

См. также