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

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

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

有什么用

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

举个栗子:

在设计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. 18.flannel的配置

    Kubernetes网络通信: (1) 容器间通信:同一个Pod内的多个容器间的通信, lo (2) Pod通信:Pod IP <--> Pod IP (3) Pod与Service通信: ...

  2. 清北学堂part2

    今天的内容分为两部分,能听懂的和听不懂的... 整一整当前阶段(oi)非常重要的知识点,扩展欧几里得, 其他的不是不重要,只是代码实现效果不很好 代码: #include<bits/stdc++ ...

  3. [Qualcomm]A Detailed History of Qualcomm 高通的前世今生

    https://www.semiwiki.com/forum/content/7353-detailed-history-qualcomm.html

  4. Lua语法基础(二)

    1. 函数 1.1 函数声明 默认为全局 局部函数使用local关键字声明 1.2 参数 ...等同于Python中*args三个点表示可变参数 1.3 获取参数长度的两种方式 (1)将传入的参数.. ...

  5. elasticsearch更改mapping(不停服务重建索引)

    转载地址:http://donlianli.iteye.com/blog/1924721?utm_source=tuicool&utm_medium=referral Elasticsearc ...

  6. Redux Counter example

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

  7. 【Sql Server】SQL SERVER 递归查询

    SQL SERVER 2005之前的版本只能用函数方法实现,SQL SERVER 2005之后新增了CTE功能,可以利用CTE实现递归查询: CTE:公用表达式Common Table Express ...

  8. mysql/mariadb主从复制

    主从复制简介 MySQL数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上. MySQL数据库支持单向.双向.链式级联, ...

  9. requests中自定义adapter

    # encoding:utf-8 import sslfrom requests import sessionsfrom requests import Requestfrom requests.ad ...

  10. MarkDown 的两种页内跳转方法!!!!!

    页面内跳转就是点击某个文本,能够跳转到页面里指定的其他地方,经常用于目录中. 第一种是利用Html5 比如点击Feature, 跳转到features中 MarkDown: [Feature](#1) ...