Enum 语句 (Visual Basic)

声明枚举并定义其成员的值。

语法

[ <attributelist> ] [ accessmodifier ]  [ Shadows ]
Enum enumerationname [ As datatype ]
   memberlist
End Enum

组成部分

  • attributelist

    可选。 应用于此枚举的属性列表。 必须将属性 列表括在 尖括号中 < (" 和 > ") " 。

    属性指示枚举实例的值可以包含多个枚举成员,并且每个成员表示枚举值中的 FlagsAttribute 位字段。

  • accessmodifier

    可选。 指定哪些代码可以访问此枚举。 可以是以下值之一:

  • Shadows

    可选。 指定此枚举重新声明并隐藏基类中同名的编程元素或重载元素集。 只能对枚举本身指定 Shadows, 不能指定其任何成员。

  • enumerationname

    必需。 枚举的名称。 有关有效名称的信息,请参阅 声明的元素名称

  • datatype

    可选。 枚举及其所有成员的数据类型。

  • memberlist

    必需。 在此语句中声明的成员常量的列表。 多个成员显示在单独的源代码行上。

    每个 member 都有以下语法和部分: [<attribute list>] member name [ = initializer ]

    组成部分 说明
    membername 必需。 此成员的名称。
    initializer 可选。 在编译时计算并分配给此成员的表达式。
  • End Enum

    终止 Enum 块。

备注

如果有一组在逻辑上彼此相关的未更改值,可以在 枚举中一起定义它们。 这将为枚举及其成员提供有意义的名称,这些名称比其值更容易记住。 然后,可以在代码中的许多位置使用枚举成员。

使用枚举的好处包括:

  • 减少转置或误用数字导致的错误。

  • 使将来更改值变得容易。

  • 使代码更易于阅读,这意味着不太可能引入错误。

  • 确保向前兼容性。 如果使用枚举,如果将来有人更改与成员名称对应的值,则代码不太可能失败。

枚举具有名称、基础数据类型和一组成员。 每个成员都表示一个常量。

在任何过程外部的类、结构、模块或接口级别声明的枚举是 成员枚举。 它是声明它的类、结构、模块或接口的成员。

可以从成员枚举的类、结构、模块或接口中的任何位置访问成员枚举。 类、结构或模块外部的代码必须使用该类、结构或模块的名称限定成员枚举的名称。 通过将 Imports 语句添加到源文件,可以避免使用完全限定的名称

在任何类、结构、模块或接口外部的命名空间级别声明的枚举是出现它的命名空间的成员。

枚举的声明 上下文必须是源文件、命名空间、类、结构、模块或接口,并且不能是过程。 有关详细信息,请参阅声明上下文和默认访问级别

可以将属性作为一个整体应用于枚举,但不能单独应用于其成员。 属性向程序集的元数据提供信息。

数据类型

Enum语句可以声明枚举的数据类型。 每个成员采用枚举的数据类型。 可以指定 Byte Integer Long SByte 、、、、、、、 Short UIntegerULong UShort

如果不为 枚举 datatype 指定 ,则每个成员都采用其 的数据类型 initializer 。 如果同时指定 datatypeinitializer ,则 的数据类型 initializer 必须可转换为 datatype 。 如果 和 datatype initializer 均不存在,则数据类型默认为 Integer

初始化成员

Enum语句可以初始化 中所选成员的内容 memberlist 。 使用 initializer 提供要分配给该成员表达式。

如果不为成员指定 ,Visual Basic将成员初始化为零 ((如果它是) 中的第一个)或初始化为大于前一个 的值的值 initializer member memberlist member

每个 中提供的表达式可以是文本、已定义的其他常量和已定义的枚举成员(包括此枚举的上一个成员)的任意 initializer 组合。 可以使用算术运算符和逻辑运算符来组合此类元素。

不能在 中使用变量或函数 initializer 。 但是,可以使用转换关键字,如 和 CByte CShort 。 如果使用常量或参数调用它,则也可使用 , AscW String 因为可以在编译时 Char 对其进行计算。

枚举不能具有浮点值。 如果为成员分配了浮点值,并且设置为 Option Strict on,则会发生编译器错误。 如果 Option Strict 为 off,则该值将自动转换为 Enum 类型。

如果成员的值超出了基础数据类型的允许范围,或者将任何成员初始化为基础数据类型允许的最大值,编译器将报告错误。

修饰符

类、结构、模块和接口成员枚举默认为公共访问。 可以使用访问修饰符调整其访问级别。 命名空间成员枚举默认为友元访问。 可以将其访问级别调整为公共级别,但不能调整为私有或受保护级别。 有关详细信息,请参阅 中的访问Visual Basic。

所有枚举成员都有公共访问权限,不能对它们使用任何访问修饰符。 但是,如果枚举本身具有更受限制的访问级别,则指定的枚举访问级别优先。

默认情况下,所有枚举都是类型,其字段是常量。 因此,声明枚举或其成员时不能使用 、 Shared StaticReadOnly 关键字。

分配多个值

枚举通常表示互斥值。 在 FlagsAttribute 声明中包含 属性后 Enum ,可以改为将多个值分配给 枚举的实例。 FlagsAttribute特性指定将枚举视为位字段,即一组标志。 这些称为 枚举。

使用 属性声明枚举时,我们建议对值使用 2 的次数,即 FlagsAttribute 1、2、4、8、16 等。 我们还建议将"None"作为值为 0 的成员的名称。 有关其他准则,请参阅 FlagsAttributeEnum

示例 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

另请参阅