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. [USACO5.1]二维凸包模板

    传送门 Description 求\(n\)个点凸包的周长 Solution  计算几何打暴力必备 Code  #include<bits/stdc++.h> #define reg re ...

  2. ICEM-R-b

    原视频下载地址:https://pan.baidu.com/s/1i4JGk8d ;密码: 4xr2

  3. es6学习3:promise

    promise含义: 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. 从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Pro ...

  4. [转发]for 循环,jQuery循环遍历详解

    1.for 循环原生JS最基本的使用: for (var i=0;i<cars.length;i++) { ..... } for - 循环代码块一定的次数2.for infor/in - 循环 ...

  5. typescript - 8.命名空间

    基础 略. https://www.tslang.cn/docs/handbook/namespaces.html 多文件中的命名空间(一个文件分解为几个) 现在,我们把Validation命名空间分 ...

  6. Spring cloud微服务安全实战-7-6自定义metrics监控指标(1)

    自己写代码来定义一个metrics,然后让prmetheus收走,在grafana里面定义一个panel并展示出来. prometheus的四种metrics指标.虽然所有的metrics都是数字,但 ...

  7. 转 Shell判断字符串包含关系的几种方法

    https://blog.csdn.net/rznice/article/details/71086839 Shell中判断字符串包含关系的方法: 1.通过grep来判断:12str1="a ...

  8. 机动车驾驶(1)--- 禁令标志汇总 by John

    以下是普通标志牌(新车安全)

  9. LeetCode_447. Number of Boomerangs

    447. Number of Boomerangs Easy Given n points in the plane that are all pairwise distinct, a "b ...

  10. express 413 Request Entity Too Large解决办法

    1.配置nginx 原因是请求实体太长了.一般出现种情况是Post请求时Body内容Post的数据太大了 如上传大文件过大; 如POST数据比较多 处理方法修改nginx.conf的值就可以解决了. ...