枚举语句 (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 块。

注解

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

使用枚举的好处包括:

  • 减少由数字转置或键入错误引起的错误。

  • 方便今后更改数值。

  • 使代码更易于阅读,这意味着引入错误的可能性较小。

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

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

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

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

在命名空间级别(在任何类、结构、模块或接口之外)声明的枚举是命名空间的成员,在该命名空间中显示该命名空间。

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

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

数据类型

Enum 语句可以声明枚举的数据类型。 每个成员采用枚举的数据类型。 可以指定Byte、、IntegerLongSByteShortUIntegerULongUShort

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

初始化成员

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

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

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

不能在 . 中使用 initializer变量或函数。 但是,可以使用转换关键字,例如 CByteCShort。 还可以将 AscW 它与常量 StringChar 参数一起调用,因为可以在编译时对其进行计算。

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

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

修饰符

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

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

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

分配多个值

枚举通常表示互斥值。 通过在声明中包括 FlagsAttribute 属性 Enum ,可以改为将多个值分配给枚举的实例。 该 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

以下示例演示如何使用按位枚举。 可以将多个值分配给按位枚举的实例。 声明包括属性EnumFlagsAttribute,该属性指示枚举可以视为一组标志。

' 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

另请参阅