枚举类型
当编译一个枚举类型时,C#编译器会将其中的每个符号转变为类型的一个常数字段。
枚举类型就是一个定义了一组常数字段的结构而已。这些字段编译后会被存放在生成模块的元数据中,且可以通过反射来访问。
Enum的静态方法:static Type Enum.GetUnderLyingType(Type enumType)。该方法返回用于保存枚举类型实例值的基础类型。每个枚举类型都有一个基础类型,它们可以是byte、sbyte、short、ushort、int(C#选用的默认值)、uint、long或ulong。
我们可以在定义一个枚举类型的时候,让其中多个符号有着相同的数值。但当将一个数值转换为枚举类型符号时,Enum的方法只返回其中的一个符号,具体返回哪个并不确定。另外,如果不存在与传入的数值对应的符号,方法将返回一个包含数值的字符串。
Enum的静态方法static Array GetValues(Type enumType)允许我们获取一个枚举类型中定义的所有符号。示例:
public enum Color
{
Red,
Green,
Blue,
}
Color[] colors = (Color[])Enum.GetValues(typeof(Color));
Enum还提供了下面两个静态方法返回一个枚举类型的符号:
//返回数值的字符串表达形式
public static String GetName(Type enumType, Object value);
//返回一个字符串数组:枚举类型中的每个符号对应一个数组元素
public static String[] GetNames(Type enumType);
将一个文本符号转换为一个枚举类型的实例:
public static Object Parse(Type enumType, String Value, Boolean ignoreCase);
使用示例:
//创建一个Color.Red枚举实例
Color c = (Color)Enum.Parse(typeof(Color), "red", true);
//创建一个值为0的Color枚举实例
Color c = (Color)Enum.Parse(typeof(Color), "0", false);
利用Enum的静态方法static bool IsDefined(Type enumType, String Value)可以判定一个数值对于某个枚举类型是否合法,示例:
//以下两行代码返回true
Enum.IsDefine(typeof(Color), 1);
Enum.IsDefine(typeof(Color), "Red");
枚举类型应该嵌套定义在需要它的类型中?还是将枚举类型与需要它的类型定义在同一层次上?在FCL中,枚举类型通常和需要它的类型定义在同一层次上。这样可以减轻开发人员的代码录入工作。所以,我们也应该将枚举类型和需要它的类型定义在同一层次上。
位标识
当定义用于标识位标记的枚举类型时,我们应该显式为每一个符号赋予映射到每个位的数值。同时,应该在枚举类型上应用System.FlagsAttribute定制特性。
示例:
[Flags]
enum Actions
{
Read = 0x0001,
Write = 0x0002,
Delete = 0x0004,
Query = 0x0008,
Sync = 0x0010
}
Actions actions = Actions.Read | Actions.Write; //0x0003
Console.WriteLine(actions.ToString()); // "Read, Write"
Actions a = (Actions)Enum.Parse(typeof(Actions), "Query,Read", false); //a = Actions.Query | Actions.Read = 9
Actions a = (Actions)Enum.Parse(typeof(Actions), "9", false); //a = Actions.Query | Actions.Read = 9