3.8 枚举
枚举是一个值类型,包含一组命名的常量,如这里的Color类型。枚举类型用enum关键字定义(代码文件EnumSample/Color. cs):
public enum Color { Red, Green, Blue }
可以声明枚举类型的变量,如变量c1,用枚举类型的名称作为前缀,设置一个命名常量,来赋予枚举中的一个值(代码文件EnumSample/Program.cs):
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(代码文件EnumSample/ DaysOfWeek.cs):
[Flags]
public enum DaysOfWeek
{
Monday = 0x1,
Tuesday = 0x2,
Wednesday = 0x4,
Thursday = 0x8,
Friday = 0x10,
Saturday = 0x20,
Sunday = 0x40
}
有了这个枚举声明,就可以使用逻辑或运算符为一个变量指定多个值 (代码文件EnumSample /Program.cs):
DaysOfWeek mondayAndWednesday = DaysOfWeek.Monday | DaysOfWeek.Wednesday; WriteLine(mondayAndWednesday);
运行程序,输出日期的字符串表示:
Monday, Tuesday
设置不同的位,也可以结合单个位来包括多个值,如Weekend的值0x60是用逻辑或运算符结合了Saturday和Sunday。Workday则结合了从Monday到Friday的所有日子,AllWeek用逻辑或运算符结合了Workday和Weekend (代码文件EnumSample / DaysOfWeek.cs):
[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值(代码文件EnumSample/Program.cs):
Color red; if (Enum.TryParse<Color>("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); }