枚举类型为定义一组可以赋值给变量的命名整数常量提供了一种有效方法。
例如,如果你必须定义一个变量,该变量的值表示一周中的一天。该变量值能存储七个有意义的值。定义这些值,就可以使用枚举类型。使用enum关键字声明。
1 enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; 2 enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };
默认情况下,枚举中每个元素的基础类型是int。使用冒号指定另一种整数值类型。
使用枚举而不使用数值类型的好处:明确为客户端代码指定哪些值是变量的有效值,在VS中,IntelliSense列出定义的值。
如果未在枚举数列表中指定元素的值,则值将自动按1递增。上面的示例中,Days.Sunday的值为0,Day.Monday的值为1,依次类推。
创建新的Days对象时,如果不显示的为其赋值,它的默认值Days.Sunday(0)。
创建枚举时,应选择最合理的默认值并赋给它一个零值。这样,只要在创建枚举时没有为其显示赋值,则所创建的全部枚举都将具有该默认值。
1 Days meetingDay = new Days(); 2 Console.WriteLine(meetingDay); 3 meetingDay = Days.Saturday; 4 Console.WriteLine(meetingDay); 5 Days meetingDays = Days.Monday; 6 Console.WriteLine(meetingDays); 7 meetingDays = Days.Sunday; 8 Console.WriteLine(meetingDays); 9 Console.ReadKey();
注意:可以将任意数值赋给meetingDay。例如
1 meetingDay = (Days)11;
不会产生错误,但不应该这么做,因为默认约定的是枚举变量只容纳枚举定义的值之一。将任意值赋给枚举类型的变量很可能会导致错误。
可以将任意值赋给枚举类型的枚举数列表中的元素,也可以使用计算值:
1 enum State 2 { 3 state1 = 0, 4 state2 = 5, 5 state3 = 10, 6 state4 = state3 + 5 7 };
可以使用枚举类型定义标志位,从而使该枚举类型的实例可以存储枚举数列表中定义的值的任意组合。(有些组合在你的程序代码中可能没有意义或不允许使用)
创建位标志枚举的方法是应用System.FlagsAttribute特性并适当定义一些值,以便可以对这些值执行AND、OR、NOT和XOR按位运算。在位标志枚举中半酣一个值为零(表示“未设置任何标志”)的命名常量。如果零值不表示“未设置任何表示”,则不要为标志置顶零值。
1 enum Days2 2 { 3 None = 0x0, 4 Sunday = 0x1, 5 Monday = 0x2, 6 Tuesday = 0x4, 7 Wednesday = 0x8, 8 Thursday = 0x10, 9 Friday = 0x20, 10 Saturdat = 0x40 11 }; 12 class MyClass { 13 Days2 meetingDays = Days2.Tuesday | Days2.Wednesday; 14 }
1 Days2 meetingDays = Days2.Tuesday | Days2.Wednesday; 2 meetingDays = meetingDays | Days2.Saturday; 3 Console.WriteLine(meetingDays); 4 5 meetingDays = meetingDays ^ Days2.Tuesday; 6 Console.WriteLine(meetingDays); 7 8 bool text = (meetingDays & Days2.Wednesday) == Days2.Wednesday; 9 Console.WriteLine("Wenday {0} a meeting day.", text == true ? "is" : "not"); 10 Console.ReadKey();
使用System.Enum方法发现和操作枚举值
所有枚举都是System.Enum类型的实例。不能从System.Enum派生新类,但可以使用它的方法发现有关枚举实例中的值的信息以及操作这些值。
1 string s = Enum.GetName(typeof(Days), 3); 2 Console.WriteLine(s); 3 4 Console.WriteLine("The values of the Days Enum are:"); 5 foreach (int i in Enum.GetValues(typeof(Days))) 6 Console.WriteLine(i); 7 Console.WriteLine("The name of the Days Enum are:"); 8 foreach (string str in Enum.GetNames(typeof(Days))) 9 Console.WriteLine(str); 10 Console.ReadKey();