浅析Flags

学习过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返回该成员的字符串名称,若不匹配,则返回枚举值。

你可能感兴趣的:(C#编程类)