类型定义:
枚举类型(enumerated types)定义了一组“符号名称/值”配对
示例:
internal enum Color{ White, //默认赋值0 Red, //赋值为1 Green, //赋值为2 Blue, //赋值为3 Orange //赋值为4 }
类型本质:
所有的枚举类型都隐式的继承自System.Enum类型,System.Enum类型是继承自System.ValueType类型唯一不为值类型的引用类型。System.Enum的定义:
public abstract class Enum:ValueType, IComparable,IFormattable,IConvertible
从定义中可以得出一下结论:
- System.Enum为引用类型,并且是一个抽象类
- System.Enum类型继承自System.ValueType类型,System.Enum类型是System.ValueType的特例,其他所有继承自System.ValueType的类型都为值类型
- System.Enum类型实现了IComparable,IFormattable,IConvertible接口
System.Enum 为枚举类型提供了共用方法,所有枚举类型均为值类型,分配于线程的堆栈上,System.Enum类型为引用类型,分配于托管堆上。枚举类型有别于其他值类型,不能定义任何方法、属性、事件
枚举规则:
下面的枚举定义与开头略有不同
internal enum Week : int { Sun = 7, Mon = 1, Tue, Wed, Thur, Fri, Sat, Weekend = Sun }
- 枚举定义时可以声明其基类型,枚举声明的类型只能是除char外的8种整数类型:byte、sbyte、short、ushort、int、uint、long和ulong
- 枚举成员是枚举类型的命名常量,任意两个枚举常量不能具有相同的名称符号,但是可以具有相同的关联值
- 枚举成员会显示和隐式与整数值相关联,默认第一个元素对应的隐式值为0,然后依次递增1,可以显示的设置关联值
常用方法:
Enum.GetUnderlyingType方法返回用于容纳一个枚举类型的值的基础类型
代码演示
internal enum Color : byte { White, Red, Green, Blue, Orange } //以下代码显示"System.byte" Console.WriteLine(Enum.GetUnderlyingType(typeof(Color)));
ToString()方法
Color c = Color.Blue; Console.WriteLine(c); //"Blue" (常规格式) Console.WriteLine(c.ToString()); //"Blue" (常规格式) Console.WriteLine(c.ToString("G")); //"Blue" (常规格式) Console.WriteLine(c.ToString("D")); // “3” (十进制格式) Console.WriteLine(c.ToString("X")); // "03"(16进制格式)
System.Enum的静态方法GetValues和GetNames分别获取枚举中所有符号的数组和符号名称数组
foreach(string item in Enum.GetValues(typeof(Week))){ Console.WriteLine("{0} : {1}",item.ToString("D"),item.ToString()); } foreach(string item in Enum.GetNames(typeof(Week))){ Console.WriteLine(item.ToString()); }
Parse和TryParse 将符号转换为枚举类型的实例
Color c=(Color) Enum.Parse(typeof(Color),"orange",true); Enum.TryParse<Color>("1",false,out c);
Enum.IsDefined方法判断一个值对于一个枚举类型是否合法
//显示为“True”,因为Color将Red定义为1 Console.WriteLine(Enum.IsDefined(typeof(Color),1)); //显示为“True”,因为Color将White定义为0 Console.WriteLine(Enum.IsDefined(typeof(Color),"White")); //显示为“False”,因为执行的是区分大小写的检查 Console.WriteLine(Enum.IsDefined(typeof(Color),"white")); //显示为“False”,因为Color没有和值10 对应的符号 Console.WriteLine(Enum.IsDefined(typeof(Color),10));
枚举的意义
- 枚举类型是代码更具有可读性
- 枚举类型是强类型的
- 枚举的声明类型,必须是基于编译器的基元类型,而不能是对应的FCL类型