Enum 语句 (Visual Basic)

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

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

部件

组成部分

说明

attributelist

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

FlagsAttribute属性指示该枚举的实例的值可以包含多个枚举成员,以及每个成员代表中的枚举值的位域。

accessmodifier

可选。 指定哪个代码可以访问此枚举。 可以是如下内容之一:

您可以指定 Protected Friend,以便从此枚举的类、某个派生类或同一程序集中的代码进行访问。

Shadows

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

enumerationname

必选。 枚举名。 有关有效名称的信息,请参见 已声明的元素名称 (Visual Basic)

datatype

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

memberlist

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

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

组成部分

说明

membername

必选。 此成员的名称。

initializer

可选。 先在编译时计算然后分配给此成员的表达式。

End Enum

终止 Enum 块。

备注

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

使用枚举的优点包括:

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

  • 以后更改值很容易。

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

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

枚举包含名称、 基础的数据类型和一组的成员。 每个成员都表示一个常数。

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

枚举成员可以是从任何位置访问它们的类、 结构、 模块或接口。 类、结构或模块之外的代码必须使用该类、结构或模块的名称来限定某个成员枚举的名称。 您可以避免需要使用完全限定的名,通过添加的导入语句的源文件。

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

声明上下文枚举必须是源文件、 命名空间、 类、 结构、 模块或接口,并且不能是一个过程。 有关更多信息,请参见声明上下文和默认访问级别 (Visual Basic)

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

数据类型

Enum 语句可以声明枚举的数据类型。 每个成员都采用相应枚举的数据类型。 您可以指定 Byte、Integer、Long、SByte、Short、UInteger、ULong 或 UShort。

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

初始化成员

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

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

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

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

枚举不能具有浮点值。 如果一个成员被分配一个浮点值和Option Strict设置为 on,发生编译器错误。 如果Option Strict已关闭,值将自动转换为Enum类型。

若成员的值超过基础数据类型允许的范围,或将任何成员初始化为基础数据类型允许的最大值,编译器将会报错。

修饰符

类、结构、模块和接口成员枚举默认为公共访问。 可以使用访问修饰符来调整它们的访问级别。 命名空间成员枚举默认为 friend 访问。 可以将这些枚举的访问级别调整为 public,但不能调整为 private 或 protected。 有关更多信息,请参见 Visual Basic 中的访问级别

所有枚举成员都具有 public 访问权限,您不能对这些成员使用任何访问修饰符。 但是,如果枚举本身具有更严格的访问级别,则指定的枚举访问级别优先。

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

指定多个值

枚举通常代表互为排它的值。 通过包括FlagsAttribute属性中Enum声明中,可以是多个值为指定枚举的实例。 FlagsAttribute属性指定枚举被视为位域,即一组标志。 这些被称为位枚举。

当声明枚举通过使用FlagsAttribute属性中,我们建议您所要使用的是 2、 1、 2、 4、 8、 16 和等等。 我们还建议"无"将其值为 0 的成员的名称。 其他指南,请参阅FlagsAttributeEnum

示例

下面的示例演示如何使用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

下面的示例中的方法是外部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

下面的示例使用 Enum 语句定义一组相关的命名常数值。 在本例中,值是可以选择用来设计数据库的数据输入窗体的颜色。

Public Enum InterfaceColors
    MistyRose = &HE1E4FF&
    SlateGray = &H908070&
    DodgerBlue = &HFF901E&
    DeepSkyBlue = &HFFBF00&
    SpringGreen = &H7FFF00&
    ForestGreen = &H228B22&
    Goldenrod = &H20A5DA&
    Firebrick = &H2222B2&
End Enum

下面的示例演示包含正数和负数的值。

Enum SecurityLevel
    IllegalEntry = -1
    MinimumSecurity = 0
    MaximumSecurity = 1
End Enum

在以下示例中, As子句用于指定datatype的枚举。

Public Enum MyEnum As Byte
  Zero
  One
  Two
End Enum

下面的示例演示如何使用按位枚举。 可以分配多个值的按位枚举实例。 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

下面的示例循环访问枚举。 它使用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

请参见

参考

Enum

Const 语句 (Visual Basic)

Dim 语句 (Visual Basic)

类型转换函数 (Visual Basic)

AscW

概念

隐式转换和显式转换 (Visual Basic)

常量和枚举 (Visual Basic)