写在前面
枚举Enum 全称(Enumeration),即一种由一组称为枚举数列表的命名常量组成的独特类型。可以看出枚举的出现时为了使我们可以在程序中方便的使用一些特定值的常量,一般的使用大家都比较熟悉,本文主要介绍枚举的特性 FlagAttribute。
FlagAttribute是什么?
Flag 特性微软的解释是:指示可以将枚举作为位域(即一组标志)处理,FlagsAttribute属性就是枚举类型的一项可选属性,它的主要作用是可以将枚举作为位域处理(P.S. C#不支持位域)。所谓位域是单个存储单元内相邻二进制位的集合。通过为枚举添加这个属性,可以改变枚举的一些行为来满足我们的需要。
比如我们有如下枚举的定义:
public enum OrderTypeEnum { Init, Complete, Waiting, Paid }
逻辑或操作我相信大家都比较熟悉了,对于整数来说,| 操作就是将其转化为二进制再进行或运算。OrderTypeEnum.Init | OrderTypeEnum.Complete做的工作实际上是 0001 | 0010 = 0011 = 3再转换成(OrderTypeEnum)3就是OrderTypeEnum.Paid了.
如果我们对两个枚举值做 | 操作,那结果会是什么样呢?
OrderTypeEnum result = OrderTypeEnum.Waiting | OrderTypeEnum.Paid;
按照或操作的原理:0010 | 0011 = 0011(3) Paid ,实质上我们想要的结果是想讲两个枚举值都作为或操作的结果,但是因为枚举值默认是从0开始顺次递增的,那么经过或操作之后就得不到我们想要的结果,那怎么办呢,这时候就需要 给枚举加上 [Flags] 的Attribute,我们先来看一下FlagsAttribute定义的准则:
我们看到第二句告诉我们当加了Flags的特性之后默认的枚举值就会以2的幂一次递增,比如 20,21,22,23(1,2,4,8....)
那我们重新看一下重新定义之后的或操作会是什么结果呢?
[Flags] public enum OrderTypeEnum { Init, Complete, Waiting, Paid }
此时我们再来看:OrderTypeEnum result = OrderTypeEnum.Complete | OrderTypeEnum.Waiting | OrderTypeEnum.Paid ;
0010 | 0100 | 1000 = 1110 我们可以看到实质上就是做了二进制的或运算,将所有位值做了合并
当我们可以用做位运算的时候,就不仅仅是或,与,非,异或等操作都可以实现。
我们知道通过这样可以把枚举值合并 OrderTypeEnum result = OrderTypeEnum.Complete | OrderTypeEnum.Waiting | OrderTypeEnum.Paid ;
那么同理也可以来判断这样的集合中是否包含某个枚举值:
result.HasFlag(OrderTypeEnum.Paid)
写在最后
枚举通过添加Flags的特性使得它能够拥有位运算的能力,更方便了我们再日常代码中的使用。
参考资料:http://www.alanzucconi.com/2015/07/26/enum-flags-and-bitwise-operators/
本文向大家介绍详细了解C# 枚举与位枚举,包括了详细了解C# 枚举与位枚举的使用技巧和注意事项,需要的朋友参考一下 一、枚举的概念: C# 枚举(Enum), 枚举类型是用于声明一组命名的常数的基本数据类型(值类型); 二、枚举的定义: 声明enum变量: 其中enum_name 指定枚举的类型名称; enumeration list 是一个用逗号分隔的标识符列表; 枚举列表中的
本文向大家介绍C#中可枚举类型详解,包括了C#中可枚举类型详解的使用技巧和注意事项,需要的朋友参考一下 枚举是迭代一个集合中的数据项的过程。 我们经常使用的大多数集合实际上都已经实现了枚举的接口IEnumerable和IEnumerator接口,这样才能使用foreach迭代,有些是含有某种抽象了枚举细节的接口:ArrayList类型有索引,BitArray有Get方法,哈希表和字典有键和值...
本文向大家介绍C#如何获取枚举的描述属性详解,包括了C#如何获取枚举的描述属性详解的使用技巧和注意事项,需要的朋友参考一下 前言 枚举为我看日常开发的可读性提供的非常好的支持,但是有时在使用枚举类型时,我们需要取名称和值,甚至有时候还需要取枚举类型的描述。通过反射,我们能获取到枚举类型的描述属性。 首先我们需要给枚举类型添加描述属性(属性都没有是不可能取到的),[Description]就是描述属
本文向大家介绍结合C++11的新特性来解析C++中的枚举与联合,包括了结合C++11的新特性来解析C++中的枚举与联合的使用技巧和注意事项,需要的朋友参考一下 枚举 枚举是用户定义的类型,其中包含一组称为枚举器的命名的整型常数。 语法 参数 identifier 指定给与枚举的类型名称。 type 枚举器的基础类型;所有枚举器都具有相同的基础类型。可能是任何整型。 enum-list 枚举中以逗号
本文向大家介绍C#如何给枚举类型增加一个描述特性详解,包括了C#如何给枚举类型增加一个描述特性详解的使用技巧和注意事项,需要的朋友参考一下 前言 相信很多人对枚举并不陌生,枚举可以很方便和直观的管理一组特定值。如果我们在页面上直接输出我们希望匹配的汉语意思或则其他满足我们需求的语句就更好了,当然,通常小伙伴们都会再页面上if(enum==1) “我是一个枚举”或者switch(enum)这种方式解
本文向大家介绍c#枚举值增加特性说明(推荐),包括了c#枚举值增加特性说明(推荐)的使用技巧和注意事项,需要的朋友参考一下 通过特性给一个枚举类型每个值增加一个字符串说明,用于打印或显示。 自定义打印特性 打印特性定义很简单,只含有一个字符串属性。 定义一个枚举 枚举类型one,two均增加了一个打印特性。 增加枚举扩展方法取得打印特性值 获取枚举值对应的枚举filed字符串 var fieldN