C# [Flags]特性 位枚举

用于学习记录

原文载自:https://www.runoob.com/w3cnote/csharp-enum.html

六、标志枚举/位枚举

C# 标记枚举(Flags):枚举类型是用于声明一组命名得常数得基本类型数据(值类型)。

枚举值是互斥得。而位标记集合是一种由组合出现得元素形成得列表,通常设计为以"位或"运算组合新值。  

枚举类型则通常表达一种语义相对独立得数值集合。而以枚举类型来实现位标记集合是最完美得组合,简称位枚举。

七、位枚举得定义  

  ///<summary>
  /// 权限枚举
  ///</summary>
  [Flags]
  public enum permission                     
  {                                  
      Unknown = 0; // 也可以写成0x00或0       
                                    
      Create = 1<<0, // 0x01或1                   
                                     
      Read = 1<<1,  //0x02或2

      Update = 1<<2, //0x04或4

      Delete = 1<<3  //0x08或8
  }
注意加了[Flags]特性后有三种写法,
第一种是使用<<符号,
第二种是0x01,
第三种是直接写01248....(一般来说是2的n次方来表示)。
注:<<左操作符,表示对这个数进行移位。

八、位枚举的实例

//1、给用户创建、读取,修改和删除的权限
var parmission = Permission.Create | parmission.Read | parmission.Update | parmission.Delete;

//2、去掉用户的修改和删除权限
parmission = parmission &~parmission.Update;
parmission = parmission &~parmission.Delete;

//3、给用户加上修改的权限
parmission = parmission | parmission.Update;

//4、判断用户是否有创建的权限
var isCreate = (parmission & parmission.Create)!=0;
//或者
var isCreate = (parmission & parmission.Create)==parmission.Create;
  这时parmission枚举的值将变成0+1+4=5,它的ToSting()将变成“parmission.Create
  parmission.Read”,parmission.Update; 这里我们可以解释为什么第五个值Delete8而不能成为5
  也就是说它的值不应该是前几项值的复合值。一个比较简单的方法
  就是用2n次方来依次位每一项赋值,例如:1248163264.......。
posted @ 2020-03-17 09:45  SusieSnail_SUN  阅读(523)  评论(0编辑  收藏  举报