第十五章 枚举类型和位标志
目录:
15.1 枚举类型和位标志
15.2 位标志
15.3 向枚举类型添加方法
15.1 枚举类型和位标志
枚举类型定义了一组“符号名称/值”配对。
枚举类型使程序更容易编写,阅读和维护。
枚举类型时强类型的。
枚举类型从System.Enum派生,是值类型,可用未装箱和已装箱的形式来表示。但不能定义任何方法,属性或事件。可利用C#的“扩展方法“功能模拟向枚举类型添加方法。
编译枚举类型时,C#编译器把每个符号转换成类型的一个常量字段。简单地说,枚举类型只是一个结构,其中定义了一组常量字段和一个实例字段。产量字段会嵌入程序集的元数据中,并可通过反射来范文。这意味者可以在运行时获得与枚举类型关联的所有符合及其值。还意味着可以将字符串符号转换成对应的数值。
15.2 位标志
经常需要枚举类型表示一组可以组合的位标志。枚举类型表示单个数值,而位标识表示集合,其中一些位于on状态,一些处于off状态。(进制1代表“on”,二进制0代表“off”)
定义用于标识位标志的枚举类型时,当然应该显示为每个符号分配一个数值。每个符号都有单独的一个处于on状态。此外,经常都要定义一个值为0的None符号。
应用了【Flags】特性,Tostring方法的工作过程:
1.获取枚举类型定义的数值集合,降序排列这些数值。
2.每个数值都和枚举实例中的值进行“按位与”计算,假如结果等于数值,与该数值关联的字符串就附加到输出字符串上,对应的位会被认为已经考虑过了,会被关闭(设为0)。这一步不断重复,直到检查完所有数值,或直到枚举实例的所有位都被关闭。
3.检查完所有数值后,如果枚举实例仍不为0,表明枚举实例中一些处于on状态的位不对应任何已定义的符号。在这种情况下,ToString将枚举实例中的原始数值作为字符串返回。
4.如果枚举实例原始值不为0,返回符号之间以逗号分隔的字符串。
5.如果枚举实例原始值为0,而枚举类型定义的一个符号对应的值是0值,就返回这个符号。
6.如果到达这一步,就返回0
Parse和TryParse方法在调用时,会在内部执行以下动作:
1.删除字符串头尾所有空白字符。
2.如果字符串第一个字符时数字,加号(+)或减号(-),该字符串会被认为是一个数字,方法返回一个枚举类型实例,其数值等于字符串转换后的数值。
3.传递的字符串被分解为一组以逗号分隔的token,每个token的空白字符串都被删除。
4.在枚举类型的已定义符号中查找每个token字符串。如果没有找到相应的符号,Parse会抛出System.ArgumentException异常;TryParse返回false。如果找到符号,就将它对应的输账号与当前的一个动态结果进行“按位或”计算,在查找下一个符号。
5.查找并找到了所有标记之后,返回这个动态结果。
15.3 向枚举类型添加方法
可利用C#的扩展方法功能模拟向枚举类型添加方法。