1、枚举
枚举是开发者定义的类型, 与类、结构一样
-
与结构一样, 枚举是值类型, 因此直接存储他们的数据, 而不是分开存储成引用和数据
-
枚举只有一种类型的成员: 命名的整数值常量
enum TrafficL
{
Green, Red, Yellow
}
-
每个枚举类型都有一个底层整数类型, 默认为int
-
每个枚举成员都被赋予一个底层类型的常量值
-
在默认情况下, 编译器对第一个成员赋值为0, 对每一个后续成员赋值都比前一个成员多1
比如此例, 编译器把int赋值给成员, 成员在栈中
enum TrafficLight
{
Green,
Yellow,
Red
}
static void Main(string[] args)
{
TrafficLight t1 = TrafficLight.Green;
TrafficLight t2 = TrafficLight.Yellow;
TrafficLight t3 = TrafficLight.Red;
Console.WriteLine($"{t1}, {(int) t1}");
Console.WriteLine($"{t2}, {(int) t2}");
Console.WriteLine($"{t3}, {(int)t3}");
//Green 0 Yello 1 Red 2
}
可以把枚举值付给枚举类型变量, 可以把成员字面量f赋给变量, 或者从另一个相同类型变量的变量复制值
static void Main(string[] args)
{
TrafficLight t1 = TrafficLight.Red;
TrafficLight t2 = TrafficLight.Green;
TrafficLight t3 = t2;
Console.WriteLine(t1);
Console.WriteLine(t2);
Console.WriteLine(t3);
//Red Green Green
}
(1)设置底层类型和显式值
可以把冒号的类型名放在枚举名之后, 这样就可以使用int以外的整数类型, 类型可以是任何整数类型
enum TrafficLight: ulong
{
...
}
-
成员常量的值可以是底层类型的任何值
-
要显式地设定一个成员的值, 在枚举声明中的变量名之后使用初始化表达式
-
名称不能重复, 但值可以重复
enum TrafficLight
{
Green,
Yellow,
Red
}
enum TrafficLight : int
{
Green = 0,
Yellow = 1,
Red = 2
}
(2)隐式成员编号
如果不初始化成员常量, 编译器将隐式地给他赋一个值, 规则如下

enum FaceCard
{
Jack = 11; //显式赋值 11
Queen; //12
King; //13
Ace; //14
NumberOfFaceCards = 4; //显式赋值 4
SomeOtherValue; //5
HightestFaceCard = Ace; //14
}