枚举的简单使用

枚举是值类型,枚举只有一种类型成员——命名的整数值常量。
默认情况下第一个成员为0,每一个后继成员赋的值都比前一个成员多1。
枚举成员是静态的,他们和枚举有着相同的可访问性。

1
2
3
4
5
enum TrafficLight{
Green,Yellow,Red
}
TrafficLight t = TrafficLight.Green;
Console.WriteLine($" {t} , { (int)t } ");//Green,0

注意枚举成员的ToString()方法返回的是成员名,强制转换才能看到枚举值。

枚举底层类型与显示值

可以设置底层类型:

1
enum TrraggicLight : ulong {...}

可以显式指定成员的值:

1
2
3
enum TrafficLight{
Green,Yellow=12,Red
}

位标志

程序员经常使用单个字的不同位作为一组开/关标志的紧凑方法,枚举为这样的使用提供了便利。
使用Flags特性装饰枚举实际上是不必要的,但可以带来一些额外的遍历。
要判断标志字是否包含特定的位标志集,可以使用枚举类型的HasFlag布尔方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Program {
static void Main(string[] args) {
CardDeckSetting ops = CardDeckSetting.SingleDeck | CardDeckSetting.FancyNumber | CardDeckSetting.Animation;
bool useFancyNumbers = ops.HasFlag(CardDeckSetting.FancyNumber);
if(useFancyNumbers) {
Console.WriteLine("ok");
}
}
}
[Flags]
enum CardDeckSetting : uint {
SingleDeck = 0x01,
LargePictures = 0x02,
FancyNumber = 0x04,
Animation = 0x08
}

Flags特性

它通知编译器、对象浏览器以及其他查看这段代码的工具,该枚举的成员不仅可以用作单独的值,还可以组合成位标志,这样浏览器就可以更恰当地解释该枚举类型的变量了。
其次,它允许枚举的ToString方法为位标志的值提供更多格式化信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Program {
static void Main(string[] args) {
CardDeckSetting ops = CardDeckSetting.SingleDeck | CardDeckSetting.FancyNumber | CardDeckSetting.Animation;
bool useFancyNumbers = ops.HasFlag(CardDeckSetting.FancyNumber);
//有Flags特性:SingleDeck, FancyNumber, Animation
//没有Flages特性:13
Console.WriteLine(ops);
}
}
[Flags]
enum CardDeckSetting : uint {
SingleDeck = 0x01,
LargePictures = 0x02,
FancyNumber = 0x04,
Animation = 0x08
}

Enum类型的一些静态方法

Enum.GetName:
参数:枚举类型对象,整数
返回:对应成员的名称
Enum.GetNames:
参数:枚举类型对象
返回:所有成员的名称且实现IEnumerable接口