C# 图解教程 第5版 —— 第12章 枚举

文章目录

    • 12.1 枚举
      • 12.1.1 设置底层类型和显式值
      • 12.1.2 隐式成员编号
    • 12.2 位标志
      • 12.2.1 Flags 特性
      • 12.2.2 使用位标志的示例(*)
    • 12.3 关于枚举的更多内容

12.1 枚举

  • 枚举是值类型。
  • 只有一种类型的成员:命名的整数值常量。
    • 每个枚举成员都被赋予一个底层类型的常量值。
    • 默认情况下,第一个成员赋值为 0,后续成员的值依次递增 1。
    • 打印时将打印成员名称。
C# 图解教程 第5版 —— 第12章 枚举_第1张图片
图12.1 枚举声明

12.1.1 设置底层类型和显式值

​ 将冒号和类型名放在枚举名之后以设置底层类型:

C# 图解教程 第5版 —— 第12章 枚举_第2张图片
图12.2 设置底层类型

​ 尽管枚举类型不能有重复的名称,但可以有重复的值。

C# 图解教程 第5版 —— 第12章 枚举_第3张图片
图12.3 等价的枚举声明

12.1.2 隐式成员编号

C# 图解教程 第5版 —— 第12章 枚举_第4张图片 C# 图解教程 第5版 —— 第12章 枚举_第5张图片
图12.4 成员赋值的法则与示例

12.2 位标志

​ 枚举可实现位标志的应用:

  1. 选取足够长度的无符号类型作为枚举底层类型。

  2. 确定每个位置代表的含义。

    • 通常使用十六进制法。
    C# 图解教程 第5版 —— 第12章 枚举_第6张图片
    图12.5 位标志的枚举声明
    • C# 7.0 后可以使用二进制表示法。
    [Flags]
    enum CardDeckSettings : uint
    {
        SingleDeck    = 0b0001, // 位 0
        LargePictures = 0b0010, // 位 1
        FancyNumbers  = 0b0100, // 位 2
        Animation     = 0b1000, // 位 3
    }
    
C# 图解教程 第5版 —— 第12章 枚举_第7张图片
图12.6 标志位的定义(左)和各自代表的值(右)
  1. 使用按位或(|)运算符设置标志位。
C# 图解教程 第5版 —— 第12章 枚举_第8张图片
图12.7 使用按位或运算设置标志位
  1. 使用按位与(&)运算符或 HasFlag 方法检查是否设置了特定标志位。

    • HasFlag 方法。
    C# 图解教程 第5版 —— 第12章 枚举_第9张图片
    图12.8 使用 HasFlag 方法检查标志位
    • 按位与 &
    image-20231028163649526
    图12.9 使用按位与运算检查标志位

12.2.1 Flags 特性

​ Flags 特性不改变计算结果,其作用如下:

  • 通知编译器等工具,该枚举可以组成位标志。
  • 允许 ToString 方法提供更多的格式化信息。
C# 图解教程 第5版 —— 第12章 枚举_第10张图片
图12.10 代码示例

​ 对于上述代码,如果没有 [Flags] 特性,将会有如下输出:

image-20231028164308094
图12.11 无 Flags 特性的输出

​ 加上特性后,ToString 方法返回结果将会发生改变:

image-20231028164419127
图12.12 有 Flags 特性的输出

12.2.2 使用位标志的示例(*)

12.3 关于枚举的更多内容

  • 成员不能有修饰符。
    • 枚举成员的可访问性默认和枚举本身相同。
  • 成员是静态的,可以随时访问。
  • 比较不同的枚举类型会导致编译时错误。
  • C# 6.0 后,可以使用 using static 来省略枚举名称。
C# 图解教程 第5版 —— 第12章 枚举_第11张图片
图12.13 使用 using static 省略枚举名称

你可能感兴趣的:(C#,图解教程,第5版,c#,开发语言)