CLR Via C# 3rd 阅读摘要 -- Chapter 15 - Enumerated Types and Bit Flags
Enumerated Types
1. 枚举类型定义了名称对应值的集合;
2. 使用枚举类型的两个原因:a.编程更容易读写和维护 b.强类型,安全;
3. 枚举类型使用关键字enum,实际上从System.Enum -> System.ValueType继承;
4. 枚举类型不能像值类型那样定义methods,properties,events。但是现在可以通过“扩展方法”给枚举类型添加方法;
5. 枚举类型中使用的象征名称必须是常量,要注意可能会招致版本问题需要重新编译;
6. static System.Enum.GetUnderlyingType(Type enumType)和instance System.Type.GetEnumUnderlyingType()可以获得枚举类型中的值的类型;
7. 枚举类型的ToString返回枚举象征名称,如果使用X返回十六进制值,总是大写。长度:byte/sbyte=2位,short/ushort=4位,int/uint=8位,long/ulong=16位,前导0补齐;
8. 可以在枚举类型中定义多个不同的象征名称对应同一个值;
9. static System.Enum.GetValues和instance System.Type.GetEnumValues可以获得枚举类型的所有值;
10. static System.Enum.GetNames和instance System.Type.GetEnumNames可以获得枚举类型的所有象征名称;
11. System.Enum.Parse和TryParse可以翻译一个名称或值字符串到对应的枚举值;
12. static System.Enum.IsDefined和instance System.Type.IsEnumDefined可以用来检验枚举参数;
13. System.Enum.IsDefined虽然用起来方便,但要注意:a. 大小写敏感的 b.使用了反射所以比较慢;
14. 枚举类型尽量定义在使用它的类的同一级。
Bit Flags
1. 枚举类型使用FlagsAttribute,表示枚举的值是按位表示的,需要显示的给每个枚举象征名称设置一个值;
2. 枚举类型如果使用了Flag,枚举变量的ToString是这样工作的
- 获得枚举类型的所有定义的枚举值(集合),以逆序排放;
- 枚举变量与每个枚举值做AND位操作,如果等于枚举值,在输出字符串后添加对应的象征名称。重复这一步骤;
- 如果所有的枚举值处理完了,枚举变量还不是0,那么ToString返回枚举变量的原始数字;
- 如果枚举变量的原始数字不是0,那么返回逗号分隔的象征名称字符串;
- 如果枚举变量的原始数字是0,而且枚举类型中有定义值为0的项,那么返回该项的名称;
- 最后,如果到这一步,那么返回“0”。
3. 不要在使用Flag的枚举类型实例上使用IsDefined方法:
- 如果你传入字符串,它不会分隔字符串之后再查找;
- 如果你传入数字,它也不会按位来进行处理。
Adding Methods to Enumerated Types
1. 就是使用扩展方法。
本章小结
本章讲了枚举类型已经按位表示(Flags)的枚举类型。解释了枚举类型的工作原理,着重讲了枚举类型的几个方法以及给枚举类型使用Flags时需要注意的事项,最后讲了如果通过使用扩展方法来给枚举类型增加方法。