zoukankan      html  css  js  c++  java
  • FlagsAttribute属性在enum中的应用

    FlagsAttribute属性在enum中的应用

          我看了Effective C#一书中的Item 
    8 : Ensure That 0 Is a Valid State for Value Types时提到了Flags属性在enum中的应用,于是就查了一下资料,写了一点关于这个的体会
         .Net C#中枚举的声明格式如下所示:

    [attributes] [modifiers] 
    enum identifier [:base-type] {enumerator-list} [;]
         FlagsAttribute属性就是枚举类型的一项可选属性。它的主要作用是可以将枚举作为位域处理(P.S. C#不支持位域)。所谓位域是单个存储单元内相邻二进制位的集合。通过为枚举添加这个属性,可以改变枚举的一些行为来满足我们的需要。

         我们声明这样一个枚举,并执行如下语句:

    enum MyFlags { Flag1, Flag2, Flag3, Flag4};

    MyFlags myFlag 
    = MyFlags.Flag2 | MyFlags.Flag3;

    Console.WriteLine(myFlag);

         得到的结果是:

    Flag4

         因为对于整数来说,
    |操作就是将其转化为二进制再进行或运算。Flags.Flag2 | Flags.Flag3做的工作实际上是 0001 | 0010 = 0011 = 3再转换成(MyFlags)3就是Flag4了

         而如果将枚举声明为:

    [FlagsAttribute]
    enum MyFlags{
         Flag1 
    = 0,    //000
         Flag2 = 1,    //001
         Flag3 = 2,    //010
         Flag4 = 4     //100
    }
    ;

         则上述程序的结果为:

    Flag2,Flag3

         这样做的意义在于我们可以实现“或”的关系

         就上例而言,myFlag可以更直观的表现为011,因此当我们想要检验它满足哪个枚举值时我们可以使用
    &操作

    if((myFlag & MyFlags.Flag2) == MyFlags.Flag2)
    {
         Console.WriteLine(
    "true");
    }

    if((myFlag & MyFlags.Flag3) == MyFlags.Flag3)

    {
         Console.WriteLine(
    "true");
    }


         
    011&001 = 001011&010 = 010,因此这两个if都会成立,这就是这种枚举的意义吧。另外我们应当注意默认初始化的myFlag的值为0,与其作&运算不会有任何结果。
  • 相关阅读:
    AS400小结(2)
    java循环链表
    RPG程序中一些小结
    学习AS400心得体会
    Vue学习二
    Vue学习一
    VC视图的多页打印(转)
    MFC对象拖拽功能(不只是文件拖拽)(转)
    Silverlight如何显示、输入上标和下标?
    【2011】Google Maps API3
  • 原文地址:https://www.cnblogs.com/RuiLei/p/664261.html
Copyright © 2011-2022 走看看