12.1 枚举
- 枚举是值类型。
- 只有一种类型的成员:命名的整数值常量。
- 每个枚举成员都被赋予一个底层类型的常量值。
- 默认情况下,第一个成员赋值为 0,后续成员的值依次递增 1。
- 打印时将打印成员名称。
12.1.1 设置底层类型和显式值
将冒号和类型名放在枚举名之后以设置底层类型:
尽管枚举类型不能有重复的名称,但可以有重复的值。
12.1.2 隐式成员编号
12.2 位标志
枚举可实现位标志的应用:
-
选取足够长度的无符号类型作为枚举底层类型。
-
确定每个位置代表的含义。
- 通常使用十六进制法。
图12.5 位标志的枚举声明 - C# 7.0 后可以使用二进制表示法。
[Flags] enum CardDeckSettings : uint { SingleDeck = 0b0001, // 位 0 LargePictures = 0b0010, // 位 1 FancyNumbers = 0b0100, // 位 2 Animation = 0b1000, // 位 3 }
- 使用按位或(
|
)运算符设置标志位。
-
使用按位与(
&
)运算符或HasFlag
方法检查是否设置了特定标志位。HasFlag
方法。
图12.8 使用 HasFlag 方法检查标志位 - 按位与
&
。
图12.9 使用按位与运算检查标志位
12.2.1 Flags 特性
Flags 特性不改变计算结果,其作用如下:
- 通知编译器等工具,该枚举可以组成位标志。
- 允许 ToString 方法提供更多的格式化信息。
对于上述代码,如果没有 [Flags]
特性,将会有如下输出:
加上特性后,ToString 方法返回结果将会发生改变:
12.2.2 使用位标志的示例(*)
12.3 关于枚举的更多内容
- 成员不能有修饰符。
- 枚举成员的可访问性默认和枚举本身相同。
- 成员是静态的,可以随时访问。
- 比较不同的枚举类型会导致编译时错误。
- C# 6.0 后,可以使用 using static 来省略枚举名称。