C#高级编程(第10版) C# 6 & .NET Core 1.0 (.NET开发经典名著)
上QQ阅读APP看书,第一时间看更新

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);
        }