[转]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 enum MyFlags  { 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.gif enum MyFlags {
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.gif {
InBlock.gif Console.WriteLine("true");
ExpandedBlockEnd.gif}

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

None.gif

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

原文:http://www.cnblogs.com/aiyagaze/archive/2006/09/16/505595.html



本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/archive/2011/10/08/2202276.html,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
C语言
C enum(枚举)
C enum(枚举)
12 0
|
4月前
|
程序员 测试技术 C++
[C++] enum枚举类型用法
[C++] enum枚举类型用法
36 0
|
3月前
|
SQL Java 数据库连接
myabtis中是否可以映射 Enum 枚举类
myabtis中是否可以映射 Enum 枚举类
Enum
Enum
69 0
|
Java C语言 Spring
enum(枚举)
枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。
188 0
|
JavaScript C#
enum:枚举类型
enum:枚举类型
133 0
|
程序员 网络安全 C++
C/C++ enum使用
C/C++ enum使用
177 0
|
安全 C# 存储

热门文章

最新文章