(转载)C# 枚举 FlagsAttribute用法
这是读过几篇文章后发现整理的最完整的一篇文章
转载地址:枚举特性FlagsAttribute的用法
先看官方的解释:指示可以将枚举作为位域(即一组标志)处理。
看起来并不好理解,到底什么是作为位域处理?
其实说的通俗点就是用二进制的表示方式来处理数学集合概念中关于集合的或与非等运算方法。
有什么用
所有可以抽象成数学集合模型的业务逻辑都可以使用该方法来处理。
举个栗子:
在设计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#代码如何实现
权限定义:
|
1
2
3
4
5
6
7
8
|
[Flags]public enum IoPermission{ Read = 1, //读取权限:0001的十进制值为1 Write = 2, //写入权限:0010的十进制值为2 Edit = 4, //修改权限:0100的十进制值为4 Run = 8, //执行权限:1000的十进制值为8} |
为用户设置权限:
|
1
|
var userPermission = IoPermission.Read | IoPermission.Write | IoPermission.Edit; |
判断功能是否可用:
|
1
|
var readEnabled = (userPermission & IoPermission.Read) == IoPermission.Read; |
另外,权限的定义还可以用位移元算来表示:
|
1
2
3
4
5
6
7
8
|
[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} |
更多的计算方法,和更多的应用场景,读者可以自行研究。
(转载)C# 枚举 FlagsAttribute用法的更多相关文章
- C++枚举类型Enum及C++11强枚举类型用法
C++中的枚举类型常常和switch配合使用,这里用一个简单的switch控制键盘回调的代码片段来说明枚举的用法: //W A S D 前.后.左.右行走 enum Keydown{ Forward= ...
- 【转载】ssh-keygen 基本用法
[转载]ssh-keygen 基本用法 原文地址:https://www.liaohuqiu.net/cn/posts/ssh-keygen-abc/ ssh 公钥认证是ssh认证的方式之一.通过公钥 ...
- 【转载】 mysql explain用法
转载链接: mysql explain用法 官网说明: http://dev.mysql.com/doc/refman/5.7/en/explain-output.html 参数: htt ...
- Java enum(枚举)的用法详解(转)
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...
- [转载] extern "C"的用法解析
本文转载自: http://www.cnblogs.com/rollenholt/archive/2012/03/20/2409046.html 1.引言 C++语言的创建初衷是“a better ...
- C# 枚举基本用法及扩展方法
没什么好说的,都是些基础! 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; usi ...
- Java ENUM枚举的用法
DK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 用法一:常量 在JDK1.5 之前,我们定义常量都是: publicstaticfianl... ...
- java枚举常见用法
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...
- Java Enum枚举的用法(转)
说明:Java的枚举比dotnet的枚举好用,至少支持的方式有很多. 用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以 ...
随机推荐
- python学习day15 模块(重点)
模块(重点) python2,与py3的区别 py2:range() 在内存中立即把所有的值都创建,xrange() 不会再内存中立即创建,而是在循环时边环边创建. py3:range() 不会再内存 ...
- nginx 配置详解(转)
nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外 ...
- 【洛谷P1659】啦啦队排练
题目大意:给定一个长度为 N 的字符串,求前 K 个长度为奇数的回文子串的长度的乘积是多少. 题解:利用回文自动机,将所有长度的回文串和个数求出来,按照长度排序进行模拟即可. 代码如下 // luog ...
- JMeter的介绍和简单使用
Apache官网(https://jmeter.apache.org/)对JMeter的解释: Apache JMeter™ Apache JMeter™应用程序是开源软件, 为负载功能和性能测试 ...
- C语言面试题大汇总之华为面试题 Eddy整理
1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局 ...
- 关于 Duplicate detection rules 自动 unpublish 的问题
最近发现自己建立的 Duplicate detection rules 在 publish 之后,会不定时地变成 unpublish 的状态,经过几次测试后,发现是每次将开发中版本更新到测试的 sit ...
- [Luogu P2966][BZOJ 1774][USACO09DEC]牛收费路径Cow Toll Paths
原题全英文的,粘贴个翻译题面,经过一定的修改. 跟所有人一样,农夫约翰以宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道 ...
- 【ARC 063F】Snuke's Coloring 2
Description There is a rectangle in the xy-plane, with its lower left corner at (0,0) and its upper ...
- CentOS 7 yum 安装php5.6
注意--enablerepo=remi --enablerepo=remi-php56这两个参数,指定源的意思 配置yum源 追加CentOS 6.5的epel及remi源. # rpm -Uvh h ...
- 关于JS数组的栈和队列操作
1.js支持重载吗? 虽然js 本身并没有函数重载,但是可以用arguments来模拟重载,函数名相同,参数不同,arguments的length属性,获取参数个数,索引属性获取参数值 2.什么是作用 ...