C# 特性(Attribute)之Flag特性

本文参考自C# 位域[flags],纯属读书笔记,加深记忆

[Flags]的微软解释是“指示可以将枚举作为位域(即一组标志)处理。”其实就是在编写枚举类型时,上面附上Flags特性后,用该枚举变量是既可以象整数一样进行按位的“|”或者按位的“&”操作了。 另外一个是在引用COM组件时使用,我没有用过,你可以查看MSDN

这种用处很大,比如权限、执行状态等,都可以用一个int型保存到数据库中,C#中使用枚举可以处理这个问题。

.Net中的枚举一般有两种用法

(1)、表示唯一的元素序列,列入一周天里面的各天

(2)、表示多种的复合状态,这个时候一般需要为枚举加上[Flags]特性为标记

下面通过代码演示[Flags]特性的作用

1、不加[Flag]特性的代码

        public enum Permission
        {
            create = 1,
            read = 2,
            update = 4,
            delete = 8,
        }

        static void Main(string[] args)
        {
            Permission permission = Permission.create | Permission.read | Permission.update | Permission.delete;
            Console.WriteLine("1、枚举创建,并赋值……");
            Console.WriteLine(permission.ToString());
            Console.WriteLine((int)permission);
        }

输出:

2、加[Flag]特性的代码

        [Flags]
        public enum Permission
        {
            create = 1,
            read = 2,
            update = 4,
            delete = 8,
        }

        static void Main(string[] args)
        {
            Permission permission = Permission.create | Permission.read | Permission.update | Permission.delete;
            Console.WriteLine("1、枚举创建,并赋值……");
            Console.WriteLine(permission.ToString());
            Console.WriteLine((int)permission);
        }

输出:

 3、分析上面的代码,发现加上[Flags]特性之后,对于枚举的追加操作,没加特性的只是单纯的从值上的相加,而加了特性的则是枚举上的相加。这也导致了create=1,read=2,update=4,delete=8的原因,因为两个状态的值相加不能等于其中任何一个的值,如果相等的话,那么[Flag]也就失去了使用它的意义(因为给一个用户赋予进行read和delete操作的权限,如果两个相加的值等于update,那不乱套了么,所以这里两个状态的值相加不能等于其中任何一个的值)。当然这里如果加一个可读可删的权限,那么就可以这样写了:readAndDelete=10。是不是很灵活!!!

这种用处很大,比如权限、执行状态等,都可以用一个int型保存到数据库中,C#中使用枚举可以处理这个问题。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

一个简易版的T4代码生成"框架"

对于企业开发来说,代码生成在某种意义上可以极大地提高开发效率和质量。在众多代码生成方案来说,T4是一个不错的选择,今天花了点时间写了一个简易版本的T4代码生成的...

2177
来自专栏逸鹏说道

.NET中的异步编程下

2、Task类 Task类是封装的一个任务类,内部使用的是ThreadPool类,提供了内建机制,让你知道什么时候异步完成以及如何获取异步执行的结果,并且还能取...

2969
来自专栏林德熙的博客

C#判断文件是否被混淆

可以使用混淆工具对一个DLL 和 exe 进行混淆。 但是如何知道一个文件是否已经混淆了。 在发布之前,需要知道是不是有文件忘了混淆。

2362
来自专栏AhDung

慎用Assembly.LoadFile()和Assembly.LoadFrom()

经测这俩方法会锁住文件,导致程序运行期间无法对load过的程序集文件进行更名/删除/覆盖等等操作,考虑用Assembly.Load()文件字节组替代:

2604
来自专栏跟着阿笨一起玩NET

事件(Event)

事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象称为事件发送方。捕获...

922
来自专栏技术博客

.Net 4.5 异步编程初试(async和await)

  最近自己在研究Asp.Net Web API。在看到通过客户端来调用Web API的时候,看到了其中的异步编程,由于自己之前没有接触过,所以就稍微的学习了解...

1233
来自专栏蘑菇先生的技术笔记

多线程中的锁系统(一)-基础用法

2515
来自专栏大内老A

[WCF REST] WebHttpBinding与消息编码

不论是我们采用SOAP还是REST架构风格,运行时框架体系依然不曾改变,终结点也仍旧是通信的核心。在Web HTTP编程模型中,我们采用基于WebHttpBin...

2156
来自专栏大内老A

ASP.NET的路由系统:根据路由规则生成URL

前面我们已经提到过,ASP.NET 的路由系统主要具有两个方面的应用,其一就是通过注册URL模板与物理文件路径的匹配实现请求地址和物理地址的分离;另一个则是通过...

2088
来自专栏恰童鞋骚年

设计模式的征途—17.模板方法(Template Method)模式

在现实生活中,很多事情都需要经过几个步骤才能完成,例如请客吃饭,无论吃什么,一般都包含:点单、吃东西、买单等几个步骤,通常情况下这几个步骤的次序是:点单=>吃东...

873

扫码关注云+社区

领取腾讯云代金券