(转载)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.... .现在好了,有了枚举,可以 ...
随机推荐
- 【LOJ#2402】[THUPC2017]天天爱射击(整体二分)
[LOJ#2402][THUPC2017]天天爱射击(整体二分) 题面 LOJ 题解 显然对于每块木板可以二分被打烂的时间. 那么直接上整体二分处理就行了. #include<iostream& ...
- mybatis 插入 含有美元符号($) 字符串 报 java.lang.IndexOutOfBoundsException: No group 2 的问题
一:问题描述: 在springboot-security框架生成BCryptPasswordEncoder()方法生成加密后的密码后,带有$符号,导致新增用户的时候插入不了,报(IndexOutOfB ...
- Idea查看并过滤某个接口或者类的实现
查看当前类的父类 会出现一个图 不过这个有点鸡肋,我们通常想看一个类的实现有哪些,虽然有个方法可以,但是没有图. 查看类的实现 在你想查看的类上 Ctrl+H(Ctrl+Alt+B是直接弹窗,不能过滤 ...
- 编写高质量的Python代码系列(六)之内置模块
Python预装了许多写程序时会用到的重要模块.这些标准软件包与通常意义上的Python语言联系得非常精密,我们可以将其当成语言规范的一部分.本节将会讲解基本的内置模块. 第四十二条:用functoo ...
- DirectX11--HLSL编译着色器的三种方法
前言 本教程不考虑Effects11(FX11),而是基于原始的HLSL. 目前编译与加载着色器的方法如下: 使用Visual Studio中的HLSL编译器,随项目编译期间一同编译,并生成.cso( ...
- Aras 发布Web Services
https://blog.csdn.net/plm888/article/details/10890173
- 新版本的Python问题
1.在print方面,新版本需要加括号,调用函数时也是如此,比如: import string s='the quick brown fox jumped to the lazy dog' print ...
- Collections -- OrderedDict类
普通dict(字典)在插入的时候并不记住元素的顺序,迭代器会根据散列表(哈希表)中存储的顺序来生成的.而OrderedDict则会记录元素的顺序,并且在迭代器输出时,会按现在记录的顺序进行遍历. 例: ...
- Linux二进制安装apache2.4.25
Linux二进制安装apache2.4.25 安装环境:CentOS 6.2 先检查是否安装了Apache 如通是通过rpm包安装的话直接用下面的命令:rpm -q httpd 也可以使用如下两种方法 ...
- 前端node.js npm i 报错Unexpected end of JSON input while parsing near
清缓存 npm cache clean --force 重新安装 npm install