(转载)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.... .现在好了,有了枚举,可以 ...
随机推荐
- fastclick原理剖析及其用法
移动端点击延迟事件 移动端浏览器在派发点击事件的时候,通常会出现300ms左右的延迟. 原因: 移动端的双击会缩放导致click判断延迟.这是为了检查用户是否在做双击.为了能够立即响应用户的点击事件, ...
- CF451E Devu and Flowers
多重集求组合数,注意到\(n = 20\)所以可以用\(2 ^ n * n\)的容斥来写. 如果没有限制那么答案就是\(C(n + s - 1, n - 1)\).对每一个限制依次考虑,加上有一种选多 ...
- Tomcat系列(11)——Tomcat 部署web应用的4种方法
核心内容 1.在Tomcat中有四种部署Web应用的方式,分别是: (1)利用Tomcat自动部署(项目直接拷贝OR WAR包拷贝 到webapps下) (2)利用控制台进行部署(tomcat的man ...
- HTML界面多语言切换
我在做个人网站时考虑到多语言转换的问题,最后在JS文件中将所有文字数据储存然后设置HTML中的class与key属性来达到多语言效果.当然,还有一个别的方法,就是所有有文字内容的div都用不同语言写一 ...
- [面试]Actor模型
Actor模型 面试中自己说话不利落, 或者自己对知识点认识不全面.在这里进行一下记录. 理论部分都是收集(copy)自网上其他的博客. 什么是Actor模型 参与者模式(英语:Actor model ...
- 一些C语言基础知识
位运算 // 按位与&: 2 & 3 = 2: 010 & 011 = 010 两个1才为1 // 按位或|: 2 | 3 = 3: 010 | 011 = 011 只 ...
- count
select deptno as 部门,count(*) as 人数from emp group by deptno; --统计各个部门的人数
- Linux之防火墙管理篇[Ubuntu:ufw]
前言 由于近期,腾讯云服务器就要到期了,学生优惠即将失效了,所以准备将数据库和项目迁移到vultr上.然而,在使用nivicat连接mysql数据库的过程中,却屡次出现:Can't connect t ...
- linux Centos7下安装python3及pip3
先去python官网下载python3安装包 执行命令:wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz 安装zlib-dev ...
- iTOP-4418/6818开发板用户使用手册内容有哪些
更多内容分享,请继续期待 iTOP-6818开发板与4418开发板共兼容同一底板: 核心板:::::: 尺寸:50mm*60mm 高度:核心板连接器组合高度1.5mm ...