这是读过几篇文章后发现整理的最完整的一篇文章

转载地址:枚举特性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用法的更多相关文章

  1. C++枚举类型Enum及C++11强枚举类型用法

    C++中的枚举类型常常和switch配合使用,这里用一个简单的switch控制键盘回调的代码片段来说明枚举的用法: //W A S D 前.后.左.右行走 enum Keydown{ Forward= ...

  2. 【转载】ssh-keygen 基本用法

    [转载]ssh-keygen 基本用法 原文地址:https://www.liaohuqiu.net/cn/posts/ssh-keygen-abc/ ssh 公钥认证是ssh认证的方式之一.通过公钥 ...

  3. 【转载】 mysql explain用法

    转载链接:  mysql explain用法 官网说明:     http://dev.mysql.com/doc/refman/5.7/en/explain-output.html 参数:  htt ...

  4. Java enum(枚举)的用法详解(转)

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  5. [转载] extern "C"的用法解析

    本文转载自: http://www.cnblogs.com/rollenholt/archive/2012/03/20/2409046.html   1.引言 C++语言的创建初衷是“a better ...

  6. C# 枚举基本用法及扩展方法

    没什么好说的,都是些基础! 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; usi ...

  7. Java ENUM枚举的用法

    DK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 用法一:常量 在JDK1.5 之前,我们定义常量都是: publicstaticfianl... ...

  8. java枚举常见用法

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  9. Java Enum枚举的用法(转)

    说明:Java的枚举比dotnet的枚举好用,至少支持的方式有很多. 用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以 ...

随机推荐

  1. git常用命令介绍

    一,仓库 1. git init    把当前目录变成git可管理得仓库,也就是初始化仓库 2. git add 文件名            在仓库中添加新文件 3. git commit -m & ...

  2. noi.ac89A 电梯

    题目 思路 首先按照\(t\)排序!!!! 首先考虑一个暴力\(dp\) 用\(f[i]\)表示前\(i\)个人到达地点所需要的时间. 那么就有如下的转移 \[f_i = min_{1 \le j \ ...

  3. 计算指定文件的MD5值

    /// <summary> /// 计算指定文件的MD5值 /// </summary> /// <param name="fileName"> ...

  4. C# activex开发中 axwebbrowser控件及 IE浏览器设置

    <object type='application/x-vlc-plugin' id='vlc' events='True' codebase='../cab/axvlc.cab' classi ...

  5. Spring Boot 2.x以后static下面的静态资源被拦截

    今天创建一个新的Spring Boot项目,没注意到spring boot的版本,发现静态资源无法访问.百度一下发现好像是Spring Boot 2.0版本以后static目录不能直接访问. 接下来直 ...

  6. 用户认证授权和Shiro入门

    1.权限管理基础(认证和授权): 前言 本文主要讲解的知识点有以下: 权限管理的基础知识 模型 粗粒度和细粒度的概念 回顾URL拦截的实现 Shiro的介绍与简单入门 一.Shiro基础知识 在学习S ...

  7. js 时间格式化 兼容safari 苹果手机

    export function formatTime (fmt, date) { date = new Date(date + '+08:00') // 兼容safari var o = { 'M+' ...

  8. 《11招玩转网络安全》之第三招:Web暴力破解-Low级别

    Docker中启动LocalDVWA容器,准备DVWA环境.在浏览器地址栏输入http://127.0.0.1,中打开DVWA靶机.自动跳转到了http://127.0.0.1/login.php登录 ...

  9. D. Vanya and Treasure Codeforces Round #355 (Div. 2)

    http://codeforces.com/contest/677/problem/D 建颗新树,节点元素包含r.c.dis,第i层包含拥有编号为i的钥匙的所有节点.用i-1层更新i层,逐层更新到底层 ...

  10. 虚拟机14安装kail Linux

    需要准备虚拟机和kail Linux镜像 1. 2.选择镜像安装,并且添加你的kail Linux镜像文件. 3. 4.在这里需要修改虚拟机名称,也可以不修改就用默认,然后在修改kail Linux的 ...