C#编程中枚举类型的使用教程
枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。例如,假设您必须定义一个变量,该变量的值表示一周中的一天。该变量只能存储七个有意义的值。若要定义这些值,可以使用枚举类型。枚举类型是使用enum关键字声明的。
enumDays{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday}; enumMonths:byte{Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec};
默认情况下,枚举中每个元素的基础类型是int。可以使用冒号指定另一种整数值类型,如前面的示例所示。可以通过转换验证基础数值与基础类型,如下例所示。
Daystoday=Days.Monday; intdayNumber=(int)today; Console.WriteLine("{0}isdaynumber#{1}.",today,dayNumber); MonthsthisMonth=Months.Dec; bytemonthNumber=(byte)thisMonth; Console.WriteLine("{0}ismonthnumber#{1}.",thisMonth,monthNumber);
输出:
Mondayisdaynumber#1. Decismonthnumber#11.
以下是使用枚举而不使用数值类型的好处:
明确为客户端代码指定哪些值是变量的有效值。
在VisualStudio中,IntelliSense列出定义的值。
如果未在枚举数列表中指定元素的值,则值将自动按1递增。在前面的示例中,Days.Sunday的值为0,Days.Monday的值为1,依此类推。创建新的Days对象时,如果不显式为其赋值,则它将具有默认值Days.Sunday(0)。创建枚举时,应选择最合理的默认值并赋给它一个零值。这便使得只要在创建枚举时未为其显式赋值,则所创建的全部枚举都将具有该默认值。
如果变量meetingDay的类型为Days,则只能将Days定义的某个值赋给它(无需显式强制转换)。如果会议日期更改,可以将Days中的新值赋给meetingDay:
DaysmeetingDay=Days.Monday; //... meetingDay=Days.Friday;
注意:可以将任意整数值赋给meetingDay。例如,代码行meetingDay=(Days)42不会产生错误。但也不应该这样做,因为默认约定的是枚举变量只容纳枚举定义的值之一。将任意值赋给枚举类型的变量很有可能会导致错误。
可以将任意值赋给枚举类型的枚举数列表中的元素,也可以使用计算值:
enumMachineState { PowerOff=0, Running=5, Sleeping=10, Hibernating=Sleeping+5 }
枚举类型作为位标志
可以使用枚举类型定义位标志,从而使该枚举类型的实例可以存储枚举数列表中定义的值的任意组合。(当然,某些组合在您的程序代码中可能没有意义或不允许使用。)
创建位标志枚举的方法是应用System.FlagsAttribute特性并适当定义一些值,以便可以对这些值执行AND、OR、NOT和XOR按位运算。在位标志枚举中包含一个值为零(表示“未设置任何标志”)的命名常量。如果零值不表示“未设置任何标志”,则请不要为标志指定零值。
在下面的示例中,定义了Days枚举的另一个版本,命名为Days2。Days2具有Flags特性,且它的每个值都是2的若干次幂,指数依次递增。这样,您将能够创建值为Days2.Tuesday和Days2.Thursday的Days2变量。
[Flags] enumDays2 { None=0x0, Sunday=0x1, Monday=0x2, Tuesday=0x4, Wednesday=0x8, Thursday=0x10, Friday=0x20, Saturday=0x40 } classMyClass { Days2meetingDays=Days2.Tuesday|Days2.Thursday; }
若要在某个枚举上设置标志,请使用按位OR运算符,如下面的示例所示:
//InitializewithtwoflagsusingbitwiseOR. meetingDays=Days2.Tuesday|Days2.Thursday; //SetanadditionalflagusingbitwiseOR. meetingDays=meetingDays|Days2.Friday; Console.WriteLine("Meetingdaysare{0}",meetingDays); //Output:MeetingdaysareTuesday,Thursday,Friday //RemoveaflagusingbitwiseXOR. meetingDays=meetingDays^Days2.Tuesday; Console.WriteLine("Meetingdaysare{0}",meetingDays); //Output:MeetingdaysareThursday,Friday
若要确定是否设置了特定标志,请使用按位AND运算,如下面的示例所示:
//TestvalueofflagsusingbitwiseAND. booltest=(meetingDays&Days2.Thursday)==Days2.Thursday; Console.WriteLine("Thursday{0}ameetingday.",test==true?"is":"isnot"); //Output:Thursdayisameetingday.
。
使用System.Enum方法发现和操作枚举值
所有枚举都是System.Enum类型的实例。不能从System.Enum派生新类,但可以使用它的方法发现有关枚举实例中的值的信息以及操作这些值。
strings=Enum.GetName(typeof(Days),4); Console.WriteLine(s); Console.WriteLine("ThevaluesoftheDaysEnumare:"); foreach(intiinEnum.GetValues(typeof(Days))) Console.WriteLine(i); Console.WriteLine("ThenamesoftheDaysEnumare:"); foreach(stringstrinEnum.GetNames(typeof(Days))) Console.WriteLine(str);