(转载)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.... .现在好了,有了枚举,可以 ...
随机推荐
- luoguP3598 Koishi Loves Number Theory
题目 题解 等比数列,最后统一除以(x-1)(这里数据都存在逆元....) (不存在逆元可以考虑表示成:x*p^y的pair形式,最后上下把p的次数相减(类似扩展Lucas)) 求:lcm(x^(ai ...
- java 判断语句和循环语句
一.判断语句:if和switch if(关系表达式1) { 语句体1; }else if (关系表达式2) { 语句体2; }…else { 语句体n+; } switch(表达式) { case 值 ...
- SSL证书安装(Tomcat)腾讯云服务器
一.SSL证书免费领取地址一年的 https://www.toolmao.com/get-free-ssl 什么你们公司买的?每次免费领取一年,能不能轮流领取没试过.商鸡,商鸡.... 二.下载SSL ...
- Node.js目录
[相关学习] npm入门教程 [基础] (1) 初识Node.js (2) 开发环境和调试工具 (3) commonJs 规范 (4) node 概念(global.process进程.调试) (5) ...
- 实验一 Java开发环境的熟悉(Linux + Idea) 20175301李锦然
https://gitee.com/ShengHuoZaiDaXue/20175301.git 实验一 Java开发环境的熟悉(Linux + Idea) 实验内容 1.使用JDK编译.运行简单的Ja ...
- 半导体制造、Fab以及Silicon Processing的基本知识
本文转载自微信公众号 - 手机技术资讯 , 链接 https://mp.weixin.qq.com/s/602xLKXcIw4ccTnhvDP1xw
- Beans 自动装配
http://wiki.jikexueyuan.com/project/spring/beans-auto-wiring/spring-autowiring-byname.html
- 适合高要求应用的高性能MEMS IMU解决方案
对于复杂且高动态惯性配置的MEMS IMU应用,评估功能时需要考虑许多属性.在设计周期早期评估这些属性优于追逐开放性成果,从而实现“尽可能精确”.ADI近期举行的在线研讨会[适合高要求应用的高性能ME ...
- insert主键返回 selectKey使用
有时候新增一条数据,知道新增成功即可,但是有时候,需要这条新增数据的主键,以便逻辑使用,再将其查询出来明显不符合要求,效率也变低了. 这时候,通过一些设置,mybatis可以将insert的数据的主键 ...
- Acitivity(活动)
1.首先活动是放在返回栈中. 2.活动的生命周期