枚举类型,相对其他类型来说,使用上要简单一些。
枚举类型: 定义了一组“符号名称/值”配对。
internal enum Color{
White,//0
Red,//1
Green,//2
Bule,//3
Orange//4
}
使用枚举类型而不是数字,可以使得代码更容易阅读,理解和维护。
使用者定义的枚举类型都是从System.Enum继承,System.Enum继承于System.ValueType,System.ValueType从Object继承而来
。从这个继承体系中,可以知道枚举类型是值类型。
要注意的是: 相对于其他值类型而言,枚举类型不允许定义方法,属性和事件。【但是现在可以使用扩展方法来给枚举类型提供方法】
编译枚举类型时,编译器会把每个枚举符号编程成类型的一个常量字段。
可以使用GetUnderlyingType
静态方法【存在于System.Enum】中。或者GetEnumUnderlyingType
实例方法【System.Type中】来返回枚举的值的类型【比如,int,byte…】
其他的一些枚举相关函数大多在System.Enum和System.Type中可以找到【具体查阅MSDN】
说到c#的枚举,提提位标志
可在枚举类型上添加【Flags/FlagsAttribute】位标志。从而方便的进行【&,|】等位相关操作。
例如:
//[Flags]
internal enum Actions
{
Read = 0x00000001,
Write = 0x00000010
}
//Main
Actions a = Actions.Read | Actions.Write;
Console.WriteLine(a);//输出17
//如果把上面[Flags]注释去掉,输出 Read,Write
也可以不使用Flags,而:
Console.WriteLine(a.ToString("F"));//输出 Read,Write
【个人除了发现输出的不同,加上Flags可以输出符号名称,没有发现其他作用】
但是:
// [Flags]
internal enum Actions
{
Read = 0x00000001,
Write = 0x00000010,
Both = 0x00000011
}
//Main
class Program
{
static void Main(string[] args)
{
Actions a = Actions.Read | Actions.Write;
Console.WriteLine(a);
//输出符号名称Both【即使没有Flags标志,也没有使用ToString("F");
}
}
在输出时,ToString()会试图将值转为对应的符号,如果没有对应的符号【此时会检查枚举类型是否有Flags/FlagsAttribute标志,如果有,它会将这个数值不会看做单独的值,而是看做一组位的组合,从而输出组合值,如果所有组合试过后】,就会输出数值,如果有,就像本例【可以输出符号】
若用枚举标识位时,最好使用2的幂进行赋值。