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