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 ]
|
||||||
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 的成员的名称。 其他指南,请参阅FlagsAttribute和Enum。
示例
下面的示例演示如何使用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