枚举的简单使用
枚举是值类型,枚举只有一种类型成员——命名的整数值常量。
默认情况下第一个成员为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接口