我是靠谱客的博主 敏感跳跳糖,最近开发中收集的这篇文章主要介绍FlagsAttribute属性在enum中的应用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

FlagsAttribute属性在enum中的应用

      我看了Effective C#一书中的Item 8 : Ensure That 0 Is a Valid State for Value Types时提到了Flags属性在enum中的应用,于是就查了一下资料,写了一点关于这个的体会
     .Net C#中枚举的声明格式如下所示:

[attributes] [modifiers]  enum  identifier [: base - type]  {enumerator-list}  [;]

     FlagsAttribute属性就是枚举类型的一项可选属性。它的主要作用是可以将枚举作为位域处理(P.S. C#不支持位域)。所谓位域是单个存储单元内相邻二进制位的集合。通过为枚举添加这个属性,可以改变枚举的一些行为来满足我们的需要。

     我们声明这样一个枚举,并执行如下语句:

ExpandedBlockStart.gif ContractedBlock.gif enum  MyFlags  dot.gif { Flag1, Flag2, Flag3, Flag4} ;
None.gif
None.gifMyFlags myFlag 
=  MyFlags.Flag2  |  MyFlags.Flag3;
None.gif
None.gifConsole.WriteLine(myFlag);
None.gif

     得到的结果是:

Flag4

     因为对于整数来说,|操作就是将其转化为二进制再进行或运算。Flags.Flag2 | Flags.Flag3做的工作实际上是 0001 | 0010 = 0011 = 3再转换成(MyFlags)3就是Flag4了

     而如果将枚举声明为:

None.gif [FlagsAttribute]
ExpandedBlockStart.gifContractedBlock.gif
enum  MyFlags dot.gif {
InBlock.gif     Flag1 
= 0,    //000
InBlock.gif
     Flag2 = 1,    //001
InBlock.gif
     Flag3 = 2,    //010
InBlock.gif
     Flag4 = 4     //100
ExpandedBlockEnd.gif
}
;
None.gif

     则上述程序的结果为:

Flag2,Flag3

     这样做的意义在于我们可以实现“或”的关系

     就上例而言,myFlag可以更直观的表现为011,因此当我们想要检验它满足哪个枚举值时我们可以使用&操作

None.gif if ((myFlag  &  MyFlags.Flag2)  ==  MyFlags.Flag2)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif     Console.WriteLine(
"true");
ExpandedBlockEnd.gif}

None.gif
if ((myFlag  &  MyFlags.Flag3)  ==  MyFlags.Flag3)
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif     Console.WriteLine(
"true");
ExpandedBlockEnd.gif}

None.gif

     011&001 = 001,011&010 = 010,因此这两个if都会成立,这就是这种枚举的意义吧。另外我们应当注意默认初始化的myFlag的值为0,与其作&运算不会有任何结果。

转载于:https://www.cnblogs.com/aiyagaze/archive/2006/09/16/505595.html

最后

以上就是敏感跳跳糖为你收集整理的FlagsAttribute属性在enum中的应用的全部内容,希望文章能够帮你解决FlagsAttribute属性在enum中的应用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部