先看官方的解释:指示可以将枚举作为位域(即一组标志)处理。

看起来并不好理解,到底什么是作为位域处理?

其实说的通俗点就是用二进制的表示方式来处理数学集合概念中关于集合的或与非等运算方法。

有什么用

所有可以抽象成数学集合模型的业务逻辑都可以使用该方法来处理。

举个栗子:

在设计IO系统时,我们需要使用一个数据结构来表示IO系统的操作权限。

分别为读取权限,写入权限,修改权限,执行权限。

在为用户添加权限时需要为用户分配一个权限值,而在使用IO功能时则需要判断该用户的权限值是否包含某个功能的权限。

这个业务场景就非常适合用数据的集合模型来处理。

每一种权限用一个集合来表示。

为用户分配的权限就用一个所有允许权限的总集合来表示。

在使用功能的时候,用户分配权限的集合是否包含该功能权限的集合的算法来处理。

用二进制的表示方式

还是上面的例子,分别是读取权限,写入权限,修改权限,执行权限四个权限。

我们用4位长度的二进制数字来表示:

第0位表示读取;

第1位表示写入;

第2位表示修改;

第3位表示执行;

而每一个位置上的数字0表示不包含,1表示包含,即0表示没有该权限,1表示有该权限。

因此每种权限分别对应的二进制数字分别是:

读取:0001;

写入:0010;

修改:0100;

执行:1000;

当为一个用户分配权限的时候,比如需要分配的权限为读取,写入,修改3个权限。

我们可以用二进制的或运算来表示集合的求并集。

0001 | 0010 | 0100 = 0111;

该用户的权限可以用二进制的0111来表示。

在使用的功能的时候,比如我要读取某文件,需要判断是否包含读取功能。

我们可以用二进制的与运算来求用户权限与读取权限的交集是否与读取权限相等的方式,来表示集合的求是否包含。

0111 & 0001 = 0001;

结果0001与读取权限0001相等,因此用户可以使用读取功能。

用C#代码如何实现

权限定义:

[Flags]
public enum IoPermission
{
Read = 1, //读取权限:0001的十进制值为1
Write = 2, //写入权限:0010的十进制值为2
Edit = 4, //修改权限:0100的十进制值为4
Run = 8, //执行权限:1000的十进制值为8
}

为用户设置权限:

var userPermission = IoPermission.Read | IoPermission.Write | IoPermission.Edit;

判断功能是否可用:

var readEnabled = (userPermission & IoPermission.Read) == IoPermission.Read;

另外,权限的定义还可以用位移元算来表示:

[Flags]
public enum IoPermission
{
Read = 1 << 0, //读取权限:1按照二进制的表示向左位移0位,即0001
Write = 1 << 1, //写入权限:1按照二进制的表示向左位移1位,即0010
Edit = 1 << 2, //修改权限:1按照二进制的表示向左位移2位,即0100
Run = 1 << 3, //执行权限:1按照二进制的表示向左位移3位,即1000
}

更多的计算方法,和更多的应用场景,读者可以自行研究。

枚举特性FlagsAttribute的用法的更多相关文章

  1. 【转】Java 枚举7常见种用法

    原文网址:http://softbeta.iteye.com/blog/1185573 Java 枚举7常见种用法 博客分类: java java枚举enmu  原创地址:http://blog.li ...

  2. [asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper

    一.需求 我们在开发中经常会遇到一些枚举,而且这些枚举类型可能会在表单中的下拉中,或者单选按钮中会用到等. 这样用是没问题的,但是用过的人都知道一个问题,就是枚举的命名问题,当然有很多人枚举直接中文命 ...

  3. Java中枚举的写法和用法

            在公司代码中,用了一大堆的枚举,看得我好懵逼.下面开始看看枚举怎么写和怎么用. 一.枚举的写法         关于枚举的写法,网上好多这方面的知识.这里直接贴一个我自己写的枚举类的代 ...

  4. 你一定需要知道的高阶JAVA枚举特性!

    JAVA枚举,比你想象中还要有用! 我经常发现自己在Java中使用枚举来表示某个对象的一组潜在值. 在编译时确定类型可以具有什么值的能力是一种强大的能力,它为代码提供了结构和意义. 当我第一次了解枚举 ...

  5. C# 枚举特性 FlagAttribute 的应用

    写在前面 枚举Enum 全称(Enumeration),即一种由一组称为枚举数列表的命名常量组成的独特类型.可以看出枚举的出现时为了使我们可以在程序中方便的使用一些特定值的常量,一般的使用大家都比较熟 ...

  6. C#枚举最优雅的用法

    public enum AbilityLevel { /// <summary> /// Indicates that the individual has a general knowl ...

  7. Java 枚举7常见种用法

    DK1.5引入了新的类型--枚举.在 Java 中它虽然算个"小"功能,却给我的开发带来了"大"方便. 用法一:常量 在JDK1.5 之前,我们定义常量都是:  ...

  8. Java 枚举7种常见用法

    (转)原创地址:http://blog.lichengwu.cn/java/2011/09/26/the-usage-of-enum-in-java/ JDK1.5引入了新的类型--枚举.在 Java ...

  9. Java枚举常见7种用法

    DK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便.用法一:常量在JDK1.5 之前,我们定义常量都是: publicstaticfianl…… .现 ...

随机推荐

  1. php提供的用户密码加密函数

    在实际项目中,对用户的密码加密基本上采用的  md5加盐的方式, php5.5后提供了一个加密函数,不需要手动加盐,不需要去维护盐值, $str = "123456"; $pwd ...

  2. [模板] 多项式: 乘法/求逆/分治fft/微积分/ln/exp/幂

    多项式 代码 const int nsz=(int)4e5+50; const ll nmod=998244353,g=3,ginv=332748118ll; //basic math ll qp(l ...

  3. Nodejs的安装配置及如何在sublimetext2中运行js

    Nodejs的安装配置及如何在sublimetext2中运行js听语音 | 浏览:4554 | 更新:2015-06-16 11:29 Nodejs的安装配置及如何在sublimetext2中运行js ...

  4. Activiti工作流框架——快速上手

        一.前言 最近在做公司的OA,里面有用到工作流,公司用的是 jbpm4,感觉比较老,资料有点少,就先学学 新一点的 activiti  ㄟ(▔▽▔)ㄏ 首先工作流的概念是:工作流(Workfl ...

  5. nginx日志相关的查询

    IP相关统计 统计IP访问量(独立ip访问数量) awk '{print $1}' access.log | sort -n | uniq | wc -l 查看某一时间段的IP访问量(4-5点) gr ...

  6. Redux Todos Example

    此项目模板是使用Create React App构建的,它提供了一种简单的方法来启动React项目而无需构建配置. 使用Create-React-App构建的项目包括对ES6语法的支持,以及几种非官方 ...

  7. vmware(1):vmware中的bridge、nat、host-only的区别

    VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式) bridged(桥接模式) 在这种模式下,VMWare虚拟出来的操作系统就 ...

  8. 映像文件工具srec

    目录 映像文件工具srec 介绍与帮助 常用例子 常用选项 一个实际的例子 hex转bin 数据填充 文件合并 文件分割 加入CRC 查看信息 使用命令集合的文本 详细文件格式的描述 附录:MDK的例 ...

  9. openstack项目【day24】:VLAN模式

    本节内容 一 二层基础知识 1.1 vlan介绍 1.1.1:vlan的含义 1.1.2:vlan的类型 1.1.3:vlan的不足 1.2 : 二层交换的基础知识 1.2.1:二层交换机最基本的功能 ...

  10. [物理学与PDEs]第4章第2节 反应流体力学方程组 2.4 反应流体力学方程组的数学结构

    1.  粘性热传导反应流体力学方程组是拟线性对称双曲 - 抛物耦合组. 2.  理想反应流体力学方程组是一阶拟线性对称双曲组 (取 ${\bf u},p,S,Z$ 为未知函数). 3.  右端项具有间 ...