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. Noip2019暑期训练2 反思

    经过两次测试,通过深刻的反思,我主要发现了以下易犯错误: 1.做题目时过于追求速度,导致好几处代码都出现手误打错的现象!而且,千万不要图快.图方便就复制粘贴,非常容易出错!(例如T3-party中直接 ...

  2. 地址栏从url输入到页面显示

    本文链接:https://blog.csdn.net/MiemieWan/article/details/85708052地址栏输入url, 要通过dns解析(浏览器是不能识别url地址的,需解析成i ...

  3. 微信小程序全局设置分享内容

    微信小程序每个页面都可以在onShareAppMessage中设置分享内容,如果想要全局设置成一样的分享内容如何设置呢? 在app.js中新增以下方法: //重写分享方法 overShare: fun ...

  4. class文件格式版本号

    major version 52:jdk 8, major version 51:jdk 7, major version 50:jdk 6, major version 49:jdk 5, majo ...

  5. 008 webpack的其他使用方式

    一:配置 1.配置文件 每次修改main文件,重新打包都要指定入口与出口,比较费事,可以使用配置文件的方式 在根目录下新建webpack.config.js: const path = require ...

  6. UltraEdit 的“查看方式”着色类项型

    UltraEdit 的“查看方式”着色类项型 2011年06月22日 13:16:00 cnki_ok 阅读数 5722   版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请 ...

  7. Could not get JDBC Connection; nested exception is java.sql.SQLException: ${jdbc.driver}

    在一个SSM分布式项目中一个服务报错: ### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnec ...

  8. Python - Django - jQuery 实现简单的 AJAX

    AJAX 局部刷新实例: 使用 jQuery 实现基本的发送 AJAX 请求 index.html: <!DOCTYPE html> <html lang="en" ...

  9. 【c++基础】C与C++接口相互调用

    前言 编译程序的时候出现错误,入口程序如果是cpp文件可以编译成功,如果是c程序则出错.一般这个问题是c与c++之间接口相互调用出现的问题. 出现的错误是undefined reference to ...

  10. Jenkins - 插件管理

    1 - Jenkins插件 Jenkins通过插件来增强功能,可以集成不同的构建工具.云平台.分析和发布工具等,从而满足不同组织或用户的需求. Jenkins 提供了不同的的方法来安装插件(需要不同级 ...