枚举类型的本质其实就是在给整型数据加标签,当编译器遇到枚举类型标签的时候,编译器会自动获取标签对应的整型数据(默认从0开始由上往下递增)
枚举类型的使用方法:
1.枚举类型的类型名是由我们自己定义的,就在enum关键字后面
2.首先我们要通过枚举类型名创建一个枚举变量
3.然后我们可以枚举变量名 + 点操作符 + 枚举类型中有的标签名 的方方式来访问对应的标签
4.编译器在识别到枚举类型标签后就会自动将标签转换为它所对应的整型数据并访问
(PS:枚举类型中每一个标签后面的等号可写可不写,不写的时候就会按照默认的顺序分别赋予对应的整型数据,如果写的话则我们可以自定义标签对应的整型数据,且这个标签后面的标签对应的整型数据也会跟着变动(以第一个变动德标签为起点,依次递增))
1.在开发过程中,出现选择的情况的话就可以使用枚举类型
2.赋值给枚举类型变量的值是 枚举类型变量 + 点操作符 + 枚举类型中的标签
接下来介绍如何在函数只有一个枚举类型参数的情况下,接收多个枚举类型中的标签
方法:在多个运算符之间使用按位或运算符(如上图)进行按位或运算
按位或运算:每一个二进制位一一对应输出结果,如果两个二进制位中有一个二进制位为1的话,则输出一个为1的二进制位,否则输出0
比如0000000000 和 0000000001 通过按位或运算符进行计算得出的结果就是 0000000001
在使用这个方法前,我们必须达成几个前提条件!
满足条件1的方法需要我们按照一定规律给每一个标签定义一个整型数据,这个规律是
第一个标签对应2的0次方,第二个标签对应2的1次方,第三个则是2的2次方,第四个,第五个依此类推
在一个枚举类型的头顶上用 [Flags] j进行修饰,给这个枚举类型打上标记,让计算机和程序员知道这个枚举类型可以进行标签多选
要注意的是,当第一个条件满足的时候,这个枚举类型就可以进行标签多选了,之所以会有第二个条件是为了增强代码的可读性
那么问题又来了,当一个枚举变量接收了多个枚举标签后,我们该怎么判断它是否接收了指定标签呢?
将接收了多个标签的枚举类型参数与特定的枚举标签a进行按位与运算,如果运算结果等于枚举类型标签a的话,则这个枚举类型参数接收的标签中包含这个枚举标签 a
(注意!!! &&,|| 两个按位与符号或者是两个按位或符号组合起来的是逻辑判断符而不是按位与 / 按位或运算符,它们的作用是进行逻辑判断而不是进行按位运算,如果要按位运算的话,,就用单个按位与& 或者是 按位或 | 符号,符号的两侧分别是参与运算的数据)
在使用按位与运算符的时候要注意运算符的优先性,比如上面这个例子
我们原本的想法是先进行style 和 PersonStyle.tall的按位与运算,然后将计算结与 PersonStyle.tall进行是否相等的逻辑判断
但是!由于运算符的优先性规定,实际上先执行的是逻辑运算符 == ,然后再执行 按位与运算符,而按位与运算符无法对bool类型的数据进行计算,所以上面这个例子会报错
根据前面的前置条件我们可以推出,如果包含的话,按位与的结果一定不为0,一旦为0就是不包含
我们可以通过强制类型装换将整型转换为对应的标签(前提是有标签和它对应),也可以将标签转换为对应的整型
(我们定义的枚举类型名)整型变量 ----> 整型转换为对应的标签
(int)标签 ---> 将标签转换为整数
调出标签的方法:我们定义的枚举类型名 + 点操作符 + 标签名
通过枚举类型创建的枚举类型变量可以接收我们调出来的枚举类型标签,一般来说一个枚举类型变量一次只能够接收一个标签,但是! 在我们对枚举类型进行处理后,使其符合可以接收多个标签的条件时,我们就能让一个枚举类型变量接收多个标签了
上图这个是在将字符串类型转换为枚举类型(如果有的话)
熟悉通过Enum基类调用Parse方法,第一个参数后面会讲,第二个参数就是我们要转换的字符串
传唤成功后就会返回一个object类型的数据,我们不能将这个数据直接传给枚举类型变量(父类可以接收子类数据,子类不可以接收父类数据)
所以我们还需要进行强制类型转换,将object类型的数据转换为对应的枚举类型
枚举类型转换为字符串 ---> 调出的标签 + 点操作符 + Tostring方法 将标签转换为字符串形式
Enum ---》 枚举关键字