枚举是一个值类型,包含一组命名的常量,如这里的Color类型。枚举类型用enum关键字定义:
public enum Color
{
Red,
Green,
Blue
}
可以声明枚举类型的变量,如变量c1,用枚举类型的名称作为前缀,设置一个命名常量,来赋予枚举中的一个值:
Color c1 = Color. Red;
WriteLine( c1);
运行程序,控制台输出显示Red,这是枚举的常量值。默认情况下,enum的类型是int。这个基本类型可以改为其他整数类型(byte、short、int、带符号的long和无符号变量)。命名常量的值从0开始递增,但它们可以改为其他值:
public enum Color : short
{
Red = 1,
Green = 2,
Blue = 3
}
使用强制类型转换可以把数字改为枚举值,把枚举值改为数字。
Color c2 = (Color) 2;
short number = (short) c2;
还可以使用enum类型把多个选项分配给一个变量,而不仅仅是一个枚举常量。为此,分配给常量的值必须是不同的位,Flags属性需要用枚举设置。
枚举类型DaysOfWeek为每天定义了不同的值。要设置不同的位,可以使用用0x前缀指定的十六进制值轻松地完成,Flags属性是编译器创建值的另一个字符串表示的信息,例如给DaysOfWeek的一个变量设置值3,结果是Monday,如果使用Flags属性,结果就是Tuesday:
[Flags]
public enum DaysOfWeek
{
Monday = 0x1,
Tuesday = 0x2,
Wednesday = 0x4,
Thursday = 0x8,
Friday = 0x10,
Saturday = 0x20,
Sunday = 0x40
}
有了这个枚举声明,就可以使用逻辑或运算符为一个变量指定多个值:
DaysOfWeek mondayAndWednesday = DaysOfWeek. Monday | DaysOfWeek. Wednesday;
WriteLine( mondayAndWednesday);
运行程序,输出日期的字符串表示:
Monday, Wednesday
设置不同的位,也可以结合单个位来包括多个值,如Weekend的值0x60是用逻辑或运算符结合了Saturday和Sunday。Workday则结合了从Monday到Friday的所有日子,AllWeek用逻辑或运算符结合了Workday和Weekend:
[Flags]
public enum DaysOfWeek
{
Monday = 0x1,
Tuesday = 0x2,
Wednesday = 0x4,
Thursday = 0x8,
Friday = 0x10,
Saturday = 0x20,
Sunday = 0x40,
Weekend = Saturday | Sunday Workday = 0x1f,
AllWeek = Workday | Weekend
}
有了这些代码,就可以把DaysOfWeek.Weekend直接分配给变量,指定用逻辑或运算符结合DaysOfWeek.
Saturday和DaysOfWeek.Sunday的单个值,也可以得到相同的结果。输出会显示Weekend的字符串表示。
DaysOfWeek weekend = DaysOfWeek. Saturday | DaysOfWeek. Sunday;
WriteLine( weekend);
使用枚举,类Enum有时非常有助于动态获得枚举类型的信息。枚举提供了方法来解析字符串,获得相应的枚举常数,获得枚举类型的所有名称和值。下面的代码片段使用字符串和Enum.TryParse来获得相应的Color值:
Color red;
if (Enum. TryParse(" Red", out red))
{
WriteLine($" successfully parsed {red}");
}
注意:Enum.TryParse<T>()是一个泛型方法,其中T是泛型参数类型。这个参数类型需要用方法调用定义。
Enum.GetNames方法返回一个包含所有枚举名的字符串数组:
foreach (var day in Enum.GetNames(typeof( Color)))
{
WriteLine( day);
}
运行应用程序,输出如下:
Red
Green
Blue
为了获得枚举的所有值,可以使用方法Enum.GetValues。Enum.GetValues返回枚举值的一个数组。为了获得整数值,需要把它转换为枚举的底层类型,为此应使用foreach语句:
foreach (short val in Enum.GetValues( typeof( Color)))
{
WriteLine( val);
}