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#不支持位域)。所谓位域是单个存储单元内相邻二进制位的集合。通过为枚举添加这个属性,可以改变枚举的一些行为来满足我们的需要。
我们声明这样一个枚举,并执行如下语句:
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,与其作 & 运算不会有任何结果。
我看了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#不支持位域)。所谓位域是单个存储单元内相邻二进制位的集合。通过为枚举添加这个属性,可以改变枚举的一些行为来满足我们的需要。
我们声明这样一个枚举,并执行如下语句:
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,与其作 & 运算不会有任何结果。