当前位置: 首页 > article >正文

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。
    • 打印时将打印成员名称。
image-20231028161533867
图12.1 枚举声明

12.1.1 设置底层类型和显式值

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

image-20231028161915703
图12.2 设置底层类型

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

image-20231028162029209
图12.3 等价的枚举声明

12.1.2 隐式成员编号

image-20231028162144729 image-20231028162221241
图12.4 成员赋值的法则与示例

12.2 位标志

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

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

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

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

    • HasFlag 方法。
    image-20231028163538165
    图12.8 使用 HasFlag 方法检查标志位
    • 按位与 &
    image-20231028163649526
    图12.9 使用按位与运算检查标志位

12.2.1 Flags 特性

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

  • 通知编译器等工具,该枚举可以组成位标志。
  • 允许 ToString 方法提供更多的格式化信息。
image-20231028164138794
图12.10 代码示例

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

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

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

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

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

12.3 关于枚举的更多内容

  • 成员不能有修饰符。
    • 枚举成员的可访问性默认和枚举本身相同。
  • 成员是静态的,可以随时访问。
  • 比较不同的枚举类型会导致编译时错误。
  • C# 6.0 后,可以使用 using static 来省略枚举名称。
image-20231028164756381
图12.13 使用 using static 省略枚举名称

http://www.kler.cn/a/108042.html

相关文章:

  • 植物明星大乱斗1
  • ‍️代码的华尔兹:在 Makefile 的指尖上舞动自动化的诗篇
  • 常见计算机网络知识整理(未完,整理中。。。)
  • python-26-Python ORM系列之pymysql实现对数据库的增删改查及新建表
  • 华为eNSP:mux-vlan
  • Debezium系列之:其他关系连接器的只读增量快照设计原理
  • golang中快速用melody搭建轻量的websocket服务
  • redirect导致的循环重定向问题(史上最全)
  • 使用反射调用类的私有内部类的私有方法
  • lvs+keepalived: 高可用集群
  • PHP 同城服务共享茶室小程序系统是如何实现的?
  • C语言二、八、十六进制转换
  • 【Apache Flink】实现有状态函数
  • 2023年马丁·加德纳聚会数学魔术分享之《不只是奇偶性的魔术》回顾
  • Android 13.0 根据包名授权悬浮窗权限
  • CSS宽度100%和宽度100vw之间有什么不同?
  • windows PC virtualBox 配置
  • 【计算机网络笔记】Web缓存/代理服务器技术
  • 用Visual Studio(VS)开发UNIX/Linux项目
  • excel巧用拼接函数CONCAT输出JSON、SQL字符串
  • Powershell脚本自动备份dhcp数据库
  • 僵尸网络|让人防不胜防的内部网络安全问题,作为企业IT不得不了解的基础安全
  • 酷开科技 | 酷开系统大屏电视,打造精彩家庭场景
  • Blueprints - 虚幻中的行为树(Behavior Tree)
  • 排序算法-堆积树排序法(HeapSort)
  • SQL企业微信群机器人消息推送