声明枚举并定义其成员的值。
语法
[ <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
、、Integer
、Long
、SByte
、Short
、UInteger
或ULong
UShort
。
如果未指定 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
因此,声明枚举或其成员时,不能使用和Static
ReadOnly
关键字。
分配多个值
枚举通常表示互斥值。 通过在声明中包括 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
以下示例演示如何使用按位枚举。 可以将多个值分配给按位枚举的实例。 声明包括属性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