学习过enum的人基本上知道枚举的成员可以显式地赋值给任何成员,若无显式赋值,编译器则会隐式地给它们赋值(隐式赋值默认从0开始依次加一,若其中某个成员有显式赋值,则后面没有显式赋值的成员默认为前一个成员的值加一)。而enum也是根据这些值去需找对应的枚举成员的。如下代码:
public enum CardDeckSettings:uint
{
SingleDeck = 0x01,
LargePictures = 0x02,
FancyNumbers = 0x04,
Animation = 0x08
}
static void Main(string[] args)
{
CardDeckSettings ops1 = CardDeckSettings.FancyNumbers;
Console.WriteLine(ops1.ToString());
ops1 = CardDeckSettings.FancyNumbers|CardDeckSettings.Animation;
Console.WriteLine(ops1.ToString());
}
运行结果:
由运行结果可知,以上代码最后的输出结果为12,而不是任何的字符串成员。原因在于,12对应的字符串成员不存在,所以编译器直接输出了12。
加上Flags的代码如下:
[Flags]
public enum CardDeckSettings:uint
{
SingleDeck = 0x01,
LargePictures = 0x02,
FancyNumbers = 0x04,
Animation = 0x08
}
而此时的运行结果变为:
若加Flags的代码变成以下代码:
[Flags]
public enum CardDeckSettings:uint
{
SingleDeck = 0x01,
LargePictures = 0x04,
FancyNumbers = 0x02,
Animation = 0x02
}
则运行结果为:
由以上结论可知,Flags特性的用途有:
1.通知编译器该枚举成员不仅可以用作单独的值,还可以按位标志进行组合。
2.允许枚举的ToString方法为位标志的值提供更多的格式化信息。即ToString方法以一个枚举值为参数,将其与枚举的常量成员相比较,若是与某个成员相匹配,ToString返回该成员的字符串名称,若不匹配,则返回枚举值。