枚举
枚举是由程序员定义的类型,与类或结构一样。
- 与结构一样,枚举是值类型:因此直接存储它们的数据,而不是分开存储成引用和数据。
- 枚举只有一种类型的成员:命名的整数值常量。
下面的代码展示了一个示例,声明了一个名称为TrafficLight的新枚举类型,它含有3个成
贝。注意成员声明列表是逗号分隔的列表,在枚举声明中没有分号。
enum TrafficLight
{Green, //逗号分割,没有分号Yellow, //逗号分割,没有分号Red
}
每个枚举类型都有一个底层整数类型,默认为int。
- 每个枚举成员都被赋予一个底层类型的常量值。
- 在默认情况下,编译器对第一个成员赋值为0,对每一个后续成员赋的值都比前一个成员多1。
例如,在TrafficLight类型中,编译器把int值0、1和2分别赋值给成员Green、Yellow
和Red。在下面代码的输出中,把它们转换成类型int,可以看到底层的成员值。图12-1阐明了
它们在栈中的排列。
enum TrafficLight
{Green, //逗号分割,没有分号Yellow, //逗号分割,没有分号Red
}TrafficLight t1=TrafficLight.Green;
TrafficLight t2=TrafficLight.Yellow;
TrafficLight t3=TrafficLight.Red;Console.WriteLine($"{t1},\t{(int)t1}");
Console.WriteLine($"{t2},\t{(int)t2}");
Console.WriteLine($"{t3},\t{(int )t3}");
可以把枚举值赋给枚举类型变量。例如,下面的代码展示了3个TrafficLight类型变量的声
明。注意可以把成员字面量赋给变量,或从另一个相同类型的变量复制值。
class Program
{enum TrafficLight{Green, //逗号分割,没有分号Yellow, //逗号分割,没有分号Red}TrafficLight t1=TrafficLight.Green;TrafficLight t2=TrafficLight.Yellow;TrafficLight t3=TrafficLight.Red;Console.WriteLine(t1);Console.WriteLine(t2);Console.WriteLine(t3);
}
这段代码产生以下输出。注意,成员名被当作字符串打印。
设置底层类型和显式值
可以把冒号和类型名放在枚举名之后,这样就可以使用int以外的整数类型。类型可以是任
何整数类型。所有成员常量都属于枚举的底层类型。
enum TrafficLight:ulong
{...
}
成员常量的值可以是底层类型的任何值。要显式地设置一个成员的值,在枚举声明中的变量
名之后使用初始化表达式。尽管不能有重复的名称,但可以有重复的值,如下所示。
enum TrafficLight
{Green=10,Yellow=15,Red=5
}
例如,图12-2中的代码展示了枚举TrafficLight的两个等价声明。
- 左边的代码接受默认的类型和编号。
- 右边的代码显式地将底层类型设置为int,并将成员设置为与默认值相应的值。