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

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

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

有什么用

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

举个栗子:

在设计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. 雷军微博拧螺丝,CFO为粉丝数发愁

    导读 小米集团联合创始人.品牌战略官黎万强4年前写的书<参与感>,估计又要热卖了. 3月24日,小米CFO周受资发微博,“我刚接受了同事的挑战,要在一定时间内在微博上有更多的粉丝”,并向粉 ...

  2. Scrapy-redis 组件

    scrapy-redis 简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 特征 分布式爬取 可以启动多个spider工程,相互之间 ...

  3. django系列7:修改404页面展示,优化模板,降低urlconf和模板之间的耦合,命名app将模板和app绑定

    为了增加程序的友好和健壮性,修改view代码,处理以下如果出现404,页面的UI展示. 修改view代码 from django.http import Http404 from django.sho ...

  4. python实现简单的百度云自动下载

    最近女同让我帮助从百度云下载200个文件,给了我连接和提取码,这种重复的工作不适合人做写了一个简单的爬虫 #coding=utf-8 ''' 自动填写提取码下载百度云资源 方法: for 读取文件中的 ...

  5. Pycharm中Django安装配置Mongodb

    一.安装mongo plugs插件 File->Setting Plugins查询Mongo选择Search in repositories 选择Mongo plugins,选择install ...

  6. Hadoop生态圈-zookeeper完全分布式部署

    Hadoop生态圈-zookeeper完全分布式部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客部署是建立在Hadoop高可用基础之上的,关于Hadoop高可用部署请参 ...

  7. 机器学习 - 正则化L1 L2

    L1 L2 Regularization 表示方式: $L_2\text{ regularization term} = ||\boldsymbol w||_2^2 = {w_1^2 + w_2^2 ...

  8. CMDB服务器管理系统【s5day89】:采集资产之整合资产

    1.业务逻辑单独写 1.代码目录结构 2.client.py from src.plugins import PluginManager class BaseClient(object): def p ...

  9. kubernetes云平台管理实战: 故障自愈实战(四)

    一.创建实验文件 [root@k8s-master ~]# cat myweb-rc.yml apiVersion: v1 kind: ReplicationController metadata: ...

  10. PHP7 学习笔记(十七)变量函数 - unset

    https://secure.php.net/manual/zh/function.unset.php unset()函数用来清除.销毁变量,不用的变量,可以用unset()将它销毁. 1.unset ...