enum的作用不做描述,这是C#的基础

设置enum 很简单,本文不做讨论。

但是enum设置值有种特殊方式,如

 enum en
{
a=,
b=,
c=,
d=,
e=,
……
}

你会发现这个枚举的值非常有规律,1,2,4,8,16,……,64,……1024。

其实质就是2^n 次方的值 。

我们再看下以下等式

10进制 2进制
1 00000001
2 00000010
4 00000100
8 00001000
16 00010000

观察2进制那一列看看有什么发现? 将这几个数按位&一下会发现得到了一个00011111 的数字,这样说可能无法理解。不过请继续看下去

通常一个字节等于8位。 1byte=8bit ,作为程序员经常能见到 byte[i]=0xFF;这样的语句,那么一个字节能存储的最大值是多少呢? 255(无符号情况下) ! 没错 0xff=+255 

0xff=+255=11111111  ,于是有人说用这种方式一个枚举能表达的最大值是255,即这样的一个枚举可以有 8个值.

再自诩观察你会发现在en这个枚举中b的值可以包含a ,c的值可以包含a,b ,a+b  (1,2,3) 这三种情况,d的值可以包含,a,b,c,a+b ,a+c ,b+c ,a+b+c 这几种情况,是不是非常巧妙

基于按位运算的这些特性,可以很方便的使用 位运算符 来计算一个枚举值是否包含了另外一个枚举值,这在权限系统中相当有用。

举个例子:

限制数据库中角色字段存储了一个值是3,en这个枚举中是没有这个值的,那么3 这个数据一定包含了多个en的枚举值:1|2 。使用位运算得到结果 1|2=3(0001|0010=0011),简直太巧妙了

那么是不是就能用一个字段来存储多个权限了?!

既然这样存储了,那么将数据拿出来后就需要有方法来判断这个值是否包含了要对比的值了,方法如下: 使用&运算来确认

例如:    var   hasFlag =((3&(int)en.a)!=0);  就可以判断是否包含   a这个值了,运算过程: 0011&0001=0001;   这说明3中包含了en.a

下边是C#中枚举运算的其他一些技巧

en   e = (en) Enum.Parse(typeof(en), 3);    //

检查枚举是否包含某个元素: 
  bool hasFlag = ((e& en.a) != 0);   //这个运算中 e.a=00000001  那么当e&e.a时候 1前边的全变成了0

要从组合状态中去掉一个元素

  en  e = en.a | en.b;  
  e1= e ^ en.a;    //e1=en.b 了, 0011^0001=0010=2=en.b

如果执行一次  e1= e1 ^ en.a  则e1的值还原

  e1=e  //0010^0001=0011=3= en.a | en.b

当en加上[flags] 特性的情况下

e.ToString()=" en.a,en.b "

enum的应用及flags特性的更多相关文章

  1. C#枚举中使用Flags特性

    .NET中的枚举我们一般有两种用法,一是表示唯一的元素序列:还有就是用来表示多种复合的状态.这个时候一般需要为枚举加上[Flags]特性标记为位域,这样我们就可以用"或"运算符组合 ...

  2. 使用C#的Flags特性

    举个例子:我有如下的一个需求,当我想要取得用户信息的时候,会先从本地缓存中查找,找不到然后从分布式缓存中查找,最后找不到再从数据库中查询.但是有些场景我又不需要查询数据库. 所以我想建立如下这种模型. ...

  3. 2019-9-2-C#枚举中使用Flags特性

    title author date CreateTime categories C#枚举中使用Flags特性 lindexi 2019-09-02 12:57:37 +0800 2018-2-13 1 ...

  4. C#枚举中使用Flags特性

    如果对一个值可以包含多个,那么可以使用枚举,加上Flags 本文告诉大家如何写一个 Flags. 在写前,需要知道一些基础知识,取反.或.与,如果不知道的话,请去看看基础. 当然,这些太复杂了,我也不 ...

  5. enum flags 枚举Flags标示 位运算符

    C#位运算 详见:http://wenku.baidu.com/link?url=4KUNkwuVTm8dwhmPLXeyYytmnDOJnmLG1L2C77kP-rY0On33ksQxwchoTlq ...

  6. 【C#进阶系列】18 特性Attribute

    这个东西有的叫定制特性,然而我喜欢直接叫特性,但是这样的话一些人不知道我说的是什么,如果我说是Attribute的话那么知道的或者用过的就都懂了. 还记得讲到枚举和位标志那一章,关于位标志,有一个[F ...

  7. 你必须知道的.NET之特性和属性(转)

    1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间走进一个发现attribute登堂入室的入口.因为.NET Framework中使用了大量的定制特性来完成代码约定 ...

  8. .NET中的枚举(Enum)

    摘要:.NET中的枚举分为简单枚举和标志枚举,这次主要总结一下标志枚举适用条件,以及它的使用方法,并在文章的最后列举枚举使用的一些规范. 在刚接触.NET的枚举时,只用简单的枚举,对于标记枚举,只知道 ...

  9. 项目中Enum枚举的使用

    在.NET中,枚举一般有两种常见用法,一是表示唯一的元素序列,比如表示订单状态(未提交,待处理,处理中...).另外一种是表示多种组合的状态,比如表示权限,因为可同时有多个不同权限. 基本用法 这里拿 ...

随机推荐

  1. spark集成kerberos

    1.生成票据 1.1.创建认证用户 登陆到kdc服务器,使用root或者可以使用root权限的普通用户操作: # kadmin.local -q “addprinc -randkey spark/yj ...

  2. element ui分页器的使用

    <el-pagination layout="total, prev, pager, next, jumper" :current-page="pageInfo.p ...

  3. mysql 存储过程 REPEAT ... UNTIL ... END REPEAT

    begin   declare  b int;   declare  use_no    varchar(10);   declare  use_name  varchar(400);   decla ...

  4. 理解Web路由(浅谈前后端路由与前后端渲染)

    1.什么是路由? 在Web开发过程中,经常会遇到『路由』的概念.那么,到底什么是路由?简单来说,路由就是URL到函数的映射. 路由的概念最开始是由后端提出来的,在以前用模板引擎开发页面的时候,是使用路 ...

  5. 关于js中onload事件的部分报错。

    当使用onload获取元素时,建议在onload事件之前定义需要获取的元素名称,在onload里面只执行获取操作,这样获取到的元素在后面才能顺利使用. <!DOCTYPE html> &l ...

  6. CentOS 7 安装FTP服务器(vsftpd)

    FTP是安装各种环境前的预备环节,因为我们要把下载好的安装包上传上去.其次,在一个团队中,FTP服务器为多用户提供了一个文件储存场所,总之是一个非常实用的工具. 1.安装vsftpd # 首先要查看你 ...

  7. remaining connection slots are reserved for non-replication superuser connections

    使用客户端工具连接pg,连接失败,报错以下错误: FATAL: remaining connection slots are reserved for non-replication superuse ...

  8. 修改mysql开启innodb支持

    1.找到/etc/my.cnf文件 a. 修改默认引擎 b. 注释掉: loose-skip-innodb c.打开被注释掉的innodb配置 2.重启服务器  /etc/init.d/mysql r ...

  9. openresty开发系列31--openresty执行流程

    openresty开发系列31--openresty执行流程 我们先看个例子 location /test {    set $a 32;    echo $a;    set $a 56;    e ...

  10. Hive Authorization

    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Authorization https://www.cloudera.c ...