(转载)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.... .现在好了,有了枚举,可以 ...
随机推荐
- 小计:Shopee批量删除修复~附脚本
需求 昨天浪的时候,无意之间看到文职人员在一个个删除违禁商品,大概23个店铺,每个店铺500多个商品,页面是用Ajax异步加载的,每删一个就需要等几秒,粗略估计一下用时:9h左右 然后了解了下是什么情 ...
- 九.django模型基础(三)之关联对象操作及多表查询
Ⅰ.关系表的数据操作 1.正向 正向:如果一个模型有外键字段,通过这个模型对外键进行操作叫做正向. 1)更新(增) a.通过属性复制 b.通过主键的方式 总结: ForeignKey 字段的更新,跟普 ...
- LA4080/UVa1416 Warfare And Logistics 最短路树
题目大意: 求图中两两点对最短距离之和 允许你删除一条边,让你最大化删除这个边之后的图中两两点对最短距离之和. 暴力:每次枚举删除哪条边,以每个点为源点做一次最短路,复杂度\(O(NM^2logN)\ ...
- [Bzoj 2956] 模积和 (整除分块)
整除分块 一般形式:\(\sum_{i = 1}^n \lfloor \frac{n}{i} \rfloor * f(i)\). 需要一种高效求得函数 \(f(i)\) 的前缀和的方法,比如等差等比数 ...
- 第二周博客作业<西北师范大学|李晓婷>
1.助教博客链接:https://home.cnblogs.com/u/lxt-/ 2.点评作业内容: https://www.cnblogs.com/dxd123/p/10494907.html#4 ...
- woe_iv原理和python代码建模
python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...
- fork子进程
title: fork子进程 data: 2019/3/21 20:24:39 toc: true --- 这里实在学习socket编程前的小知识点,用来创建多个服务端 学习文档 函数可以有两个返回值 ...
- flask websocker
WebSocket 是一种网络通信协议.RFC6455 定义了它的通信标准. HTTP 协议是一种无状态的.无连接的.单向的应用层协议.它采用了请求/响应模型.通信请求只能由客户端发起,服务端对请求做 ...
- js制作可拖拽可点击的悬浮球
兼容mouse事件和touch事件,支持IE9及其以上 效果展示:https://jsfiddle.net/shifeng/7xebf3u0/ // index.html <!DOCTYPE h ...
- JAVA集合1--总体框架
JAVA集合是JAVA提供的工具包,包含了常用的数据结构:集合.链表.栈.队列.数组.映射等.JAVA集合工具包的位置是java.util.* JAVA集合主要可以分为4个部分:List.Set.Ma ...