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 语句可以声明枚举的数据类型。 每个成员都采用枚举的数据类型。 可以指定 ByteIntegerLongSByteShortUIntegerULongUShort

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

初始化成员

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

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

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

你不能在 initializer 中使用变量或函数。 但是,你可以使用转换关键字,例如 CByteCShort。 如果你使用常量 StringChar 参数调用它,你也可以使用 AscW,因为它可以在编译时进行求值。

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

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

修饰符

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

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

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

分配多个值

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

使用 FlagsAttribute 属性声明枚举时,建议对值使用 2 的幂(即 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

另请参阅