声明枚举并定义其成员的值。
语法
[ <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可选。 在编译时计算并分配给此成员的表达式。 EndEnum终止
Enum块。
注解
如果有一组在逻辑上相互关联的未更改值,则可以在枚举中将它们一起定义。 这为枚举及其成员提供了有意义的名称,这些名称比枚举的值更容易记住。 然后,可以在代码的许多位置使用枚举成员。
使用枚举的好处包括:
减少由数字转置或键入错误引起的错误。
方便今后更改数值。
使代码更易于阅读,这意味着引入错误的可能性较小。
确保向前兼容性。 如果使用枚举,则如果将来有人更改与成员名称对应的值,则代码不太可能失败。
枚举具有名称、基础数据类型和一组成员。 每个成员表示一个常量。
在任何过程之外,在类、结构、模块或接口级别声明的枚举是 成员枚举。 它是声明它的类、结构、模块或接口的成员。
可以从其类、结构、模块或接口中的任何位置访问成员枚举。 类、结构或模块外部的代码必须使用该类、结构或模块的名称限定成员枚举的名称。 通过将 Imports 语句添加到源文件,可以避免使用完全限定的名称。
在命名空间级别(在任何类、结构、模块或接口之外)声明的枚举是命名空间的成员,在该命名空间中显示该命名空间。
枚举的 声明上下文 必须是源文件、命名空间、类、结构、模块或接口,不能是过程。 有关详细信息,请参阅 声明上下文和默认访问级别。
可以将属性作为一个整体应用于枚举,但不能单独应用于其成员。 特性为程序集的元数据提供信息。
数据类型
该 Enum 语句可以声明枚举的数据类型。 每个成员采用枚举的数据类型。 可以指定Byte、、Integer、Long、SByte、Short、UInteger或ULongUShort。
如果未指定 datatype 枚举,则每个成员都采用其 initializer数据类型。 如果同时指定这两个datatype类型,并且必须可转换为datatype的数据类型initializer。initializer 如果两者 datatype 均 initializer 不存在,则数据类型默认为 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 中的 Access 级别。
所有枚举成员都具有公共访问权限,并且不能对它们使用任何访问修饰符。 但是,如果枚举本身具有更受限的访问级别,则指定的枚举访问级别优先。
默认情况下,所有枚举都是类型,其字段是常量。
Shared因此,声明枚举或其成员时,不能使用和StaticReadOnly关键字。
分配多个值
枚举通常表示互斥值。 通过在声明中包括 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
以下示例演示如何使用按位枚举。 可以将多个值分配给按位枚举的实例。 声明包括属性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