问题历史
在Visual Basic中,枚举(Enum)用于提高代码的可读性和可靠性。Enum允许定义一组命名常量,从而创建程序逻辑的严格可接受值集。
问题
许多人认为Enum完全限制了变量的值为所列出的成员之一。但实际上,Enum变量存储的是整数类型的值,可以赋予基础类型的任何有效值,这可能导致错误和意外行为。
解决方案
在VB.NET中,赋予Enum变量一个未在列表中定义的值并不被禁止。为了安全遍历值,可以使用System.Enum.GetValues函数。通过额外的检查来控制值的有效性。
代码示例:
Enum Colors Red = 1 Green = 2 Blue = 3 End Enum Dim c As Colors = CType(4, Colors) ' 这不会是编译错误! For Each value As Colors In [Enum].GetValues(GetType(Colors)) Console.WriteLine(value) Next ' 检查 If [Enum].IsDefined(GetType(Colors), c) Then Console.WriteLine("OK") Else Console.WriteLine("不正确的值!") End If
关键特性:
可以保证Enum变量始终仅包含声明的值吗?
不能。在语言层面上,Enum是基础数值类型的简化封装。特定值的有效性检查总是需要通过IsDefined显式进行。
是否可以通过Enum的值获取其字符串表示,即使它未被声明?
可以。对于赋予不存在值的Enum,ToString方法会返回该数值等效的字符串:例如,Colors = 4,结果将是"4"。
如果通过Enum.GetValues列出所有值,然后给Enum变量赋予超出枚举范围的数字,会发生什么?
GetValues遍历将仅返回声明的成员,而Enum变量仍可以包含超范围的任意数字——这将成为逻辑错误,而不是语法错误。
从屏幕的输入直接转换为Enum而没有验证——得到不正确的值,并在后续阶段导致应用程序崩溃。
优点:
缺点:
首先通过Enum.IsDefined验证用户输入的值,即使数据不正确,处理也是正确的。
优点:
缺点: