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