免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 869 | 回复: 0
打印 上一主题 下一主题

FlagsAttribute属性在enum中的应用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-21 08:41 |只看该作者 |倒序浏览
http://www.cnblogs.com/aiyagaze/archive/2006/09/16/505595.html

.Net C#中枚举的声明格式如下所示:
[attributes] [modifiers] enum identifier [:base-type] {enumerator-list} [;]

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

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

enum MyFlags { Flag1, Flag2, Flag3, Flag4};

MyFlags myFlag 
= MyFlags.Flag2 | MyFlags.Flag3;

Console.WriteLine(myFlag);

     得到的结果是:

Flag4

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

     而如果将枚举声明为:

[FlagsAttribute]
enum MyFlags{
     Flag1 
= 0,    //000
     Flag2 = 1,    //001
     Flag3 = 2,    //010
     Flag4 = 4     //100
}
;

     则上述程序的结果为:

Flag2,Flag3

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

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

if((myFlag & MyFlags.Flag2) == MyFlags.Flag2)
{
     Console.WriteLine(
"true");
}

if((myFlag & MyFlags.Flag3) == MyFlags.Flag3)

{
     Console.WriteLine(
"true");
}

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP