vs2017网站开发组件,网站分屏布局设计,电脑打不开网页但是能上网,宁波市建设教育培训网写在前面枚举Enum 全称(Enumeration)#xff0c;即一种由一组称为枚举数列表的命名常量组成的独特类型。可以看出枚举的出现是为了使我们可以在程序中方便的使用一些特定值的常量#xff0c;一般的使用大家都比较熟悉#xff0c;本文主要介绍枚举的特性 FlagAttribute。Flag… 写在前面枚举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 00113 Paid 实质上我们想要的结果是想讲两个枚举值都作为或操作的结果但是因为枚举值默认是从0开始顺次递增的那么经过或操作之后就得不到我们想要的结果那怎么办呢这时候就需要 给枚举加上 [Flags] 的Attribute我们先来看一下FlagsAttribute定义的准则使用FlagsAttribute枚举才是对数字值执行按位运算 AND、 OR 独占或 的自定义属性。在 2 的幂即 1、 2、 4、 8 等中定义枚举常量。 这意味着不重叠中组合的枚举常量的各个标志。请考虑创建针对常用的标志组合的枚举的常数。 例如如果你有用于文件 I/O 操作的枚举包含枚举的常数Read 1和Write 2请考虑创建枚举的常数ReadWrite Read OR Write它结合Read和Write标志。 此外可用于组合标志的按位 OR 操作视为在某些情况下不应为用于简单任务所需的一个高级的概念。如果为标志枚举常量中定义为负数因为很多标志位置可能会设置为 1这可能会使你的代码的混乱并鼓励编码错误请务必小心。测试是否在数值中设置一个标志一种简便方式是执行按位操作之间的数字值和标志枚举的常数它将所有位都设置为不对应于标志的零的数字值中然后测试该操作的结果是否等于该标志枚举常量。使用None用作枚举其值为零的常量的标志名称。 不能使用None按位运算中来测试一个标志因为结果始终为零的枚举的常数。 但是你可以执行的逻辑不之间的数字值的按位、 比较和None枚举的常量以确定是否已设置在数值中的任何位。如果你创建而不是标志枚举的值枚举它是仍必要创建None枚举的常数。 原因是默认情况下用于枚举的内存初始化为零的公共语言运行时。 因此如果未定义其值为零的常量枚举将包含在创建时非法值。如果你的应用程序需要表示明显默认情况下请考虑使用其值为零表示默认值的枚举的常数。 如果没有任何默认情况下请考虑使用其值为零的枚举的常数意味着不由任何其他枚举常量表示这种情况。未定义一个枚举值只是为了镜像与枚举本身的状态。 例如不定义仅用于枚举的结束标记的枚举的常数。 如果你需要确定在枚举的最后一个值请显式检查该值。 此外你可以执行范围检查第一个和最后一个枚举常量如果范围内的所有值都是有效。不要指定保留供将来使用的枚举的常数。当你定义的方法或属性它采用作为值的枚举的常数时请考虑验证值。 原因是即使该数值不在枚举中定义你可以强制转换为枚举类型的数字值。我们看到第二句告诉我们当加了Flags的特性之后默认的枚举值就会以2的幂一次递增比如 202122231248....)那我们重新看一下重新定义之后的或操作会是什么结果呢[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 ;那么同理也可以来判断这样的集合中是否包含某个枚举值1result.HasFlag(OrderTypeEnum.Paid) 写在最后枚举通过添加Flags的特性使得它能够拥有位运算的能力更方便了我们再日常代码中的使用。参考资料http://www.alanzucconi.com/2015/07/26/enum-flags-and-bitwise-operators/原文https://www.cnblogs.com/Wolfmanlq/p/8525090.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com