购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.7 枚举类型

枚举类型是一种特殊的值类型,我们能够在该类型中定义一组命名的数值常量。例如:

使用枚举类型的方法如下:

每一个枚举成员都对应一个整数。在默认情况下:

· 对应的数值是 int 类型的。

· 按照枚举成员的声明顺序,自动按照0、1、2……进行常量赋值。

当然,可以指定其他的整数类型代替默认类型,例如:

也可以显式指定每一个枚举成员对应的值:

编译器还支持显式指定部分枚举成员。没有指定的枚举成员,在最后一个显式指定的值基础上递增。因此上例等价于:

3.7.1 枚举类型转换

枚举类型的实例可以与它对应的整数值相互显式转换:

也可以显式将一个枚举类型转换为另一个。假设 HorizontalAlignment 定义为:

则两个枚举类型之间的转换是通过对应的整数值进行的:

在枚举表达式中,编译器会特殊对待数值字面量 0 ,它不需要进行显式转换:

0 进行特殊对待的原因有如下两个:

· 第一个枚举成员经常作为默认值。

· 在合并枚举类型中, 0 表示无标志。

3.7.2 标志枚举类型

枚举类型的成员可以合并。为了避免混淆,合并枚举类型的成员要显式指定值,典型的值为2的幂次。例如:

或者

可以使用位运算符合并枚举类型的值,例如, | & ,它们将作用在对应的整数值上。

按照惯例,当枚举类型的成员可以合并时,其枚举类型一定要应用 Flags 特性。如果声明了一个没有标注 Flags 特性的枚举类型,其成员依然可以合并,但若在该枚举实例上调用 ToString 方法,则会输出一个数值而非一组名字。

一般来说,合并枚举类型通常用复数名词而不用单数形式。

为了方便起见,可以将合并的成员直接放在枚举的声明内:

3.7.3 枚举运算符

枚举类型可用的运算符有:

位运算符、算术运算符和比较运算符都返回对应整数值的运算结果。枚举类型和整数类型之间可以做加法,但两个枚举类型之间不能做加法。

3.7.4 类型安全问题

请看下面的枚举类型:

由于枚举类型可以和它对应的整数类型相互转换,因此枚举的真实值可能超出枚举类型成员的数值范围:

位运算符和算术运算符也会产生类似的非法值:

非法的 BorderSide 的枚举值可能破坏如下的程序:

针对上述问题的解决方案之一是再加上一个 else 子句:

而另一个解决方案是显式检查枚举值的合法性。可以使用静态方法 Enum.IsDefined 来执行该操作:

遗憾的是, Enum.IsDefined 对标志枚举类型不起作用,然而下面的方法(巧妙使用了 Enum.ToString() 的行为)可以在标志枚举类型合法时返回 true MH89avOJNLdejdlgKjxO0oY1cg9LVAEkXyPRQXX761ATqnv4h0A6cPzTNVQ16b24

点击中间区域
呼出菜单
上一章
目录
下一章
×