FlagsAttribute属性在enum中的应用

本文介绍了.NET C#中如何使用FlagsAttribute属性将枚举类型转换为位域形式,以便支持位运算操作如或关系等。文章还详细解释了在枚举中设置不同数值对位运算的影响。
None.gifFlagsAttribute属性在enum中的应用
None.gif
None.gif      我看了Effective C#一书中的Item 
8 : Ensure That 0 Is a Valid State for Value Types时提到了Flags属性在enum中的应用,于是就查了一下资料,写了一点关于这个的体会
None.gif     .Net C#中枚举的声明格式如下所示:
None.gif
ExpandedBlockStart.gifContractedBlock.gif[attributes] [modifiers] 
enum identifier [:base-type] dot.gif{enumerator-list} [;]
None.gif     FlagsAttribute属性就是枚举类型的一项可选属性。它的主要作用是可以将枚举作为位域处理(P.S. C#不支持位域)。所谓位域是单个存储单元内相邻二进制位的集合。通过为枚举添加这个属性,可以改变枚举的一些行为来满足我们的需要。
None.gif
None.gif     我们声明这样一个枚举,并执行如下语句:
None.gif
ExpandedBlockStart.gifContractedBlock.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
None.gif     得到的结果是:
None.gif
None.gifFlag4
None.gif
None.gif     因为对于整数来说,
|操作就是将其转化为二进制再进行或运算。Flags.Flag2 | Flags.Flag3做的工作实际上是 0001 | 0010 = 0011 = 3再转换成(MyFlags)3就是Flag4了
None.gif
None.gif     而如果将枚举声明为:
None.gif
None.gif[FlagsAttribute]
ExpandedBlockStart.gifContractedBlock.gif
enum MyFlagsdot.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
None.gif     则上述程序的结果为:
None.gif
None.gifFlag2,Flag3
None.gif
None.gif     这样做的意义在于我们可以实现“或”的关系
None.gif
None.gif     就上例而言,myFlag可以更直观的表现为011,因此当我们想要检验它满足哪个枚举值时我们可以使用
&操作
None.gif
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
None.gif     
011&001 = 001011&010 = 010,因此这两个if都会成立,这就是这种枚举的意义吧。另外我们应当注意默认初始化的myFlag的值为0,与其作&运算不会有任何结果。
None.gif

转载于:https://www.cnblogs.com/RuiLei/archive/2007/03/05/664261.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值