什么';这两个enum[Flags]声明(C#)之间的区别是什么
我问这个问题更多的是为了理解,而不是解决一个问题。考虑下面两个:什么';这两个enum[Flags]声明(C#)之间的区别是什么,c#,enums,bit-manipulation,bit,C#,Enums,Bit Manipulation,Bit,我问这个问题更多的是为了理解,而不是解决一个问题。考虑下面两个: [Flags] public enum Flags { NONE = 0x0, PASSUPDATE = 0x1, PASSRENDER = 0x2, DELETE = 0x4, ACCEPTINPUT = 0x8, FADE_IN = 0x10, FADE_OUT = 0x20, FAD
[Flags]
public enum Flags
{
NONE = 0x0,
PASSUPDATE = 0x1,
PASSRENDER = 0x2,
DELETE = 0x4,
ACCEPTINPUT = 0x8,
FADE_IN = 0x10,
FADE_OUT = 0x20,
FADE_OUT_COMPLETE = 0x40
}
[Flags]
public enum Flags
{
NONE = 0x0,
PASSUPDATE,
PASSRENDER,
DELETE,
ACCEPTINPUT,
FADE_IN ,
FADE_OUT,
FADE_OUT_COMPLETE
}
如果我使用后一个枚举对某些内容进行位检查,有时会出现重叠(我认为像
DELETE
这样的内容会被解释为PASSUPDATE | PASSRENDER
,而在第一个示例中,每个条目彼此独立(即,DELETE
仅是DELETE
,无法使用不同标志集的组合进行验证)。如果没有明确的数字,枚举每次递增1(即使指定了[flags]
),因此您可以得到:
[Flags]
public enum Flags
{
NONE = 0x0,
PASSUPDATE, // = 1
PASSRENDER,// = 2
DELETE,// = 3
ACCEPTINPUT,// = 4
FADE_IN ,// = 5
FADE_OUT,// = 6
FADE_OUT_COMPLETE// = 7
}
哪一个不是您想要的数字(当然也不是位标志,通常是2的连续幂)显示代码,其中Delete被计算为两个过程
[flags]
属性不会神奇地将枚举转换为二进制枚举。您应该重新思考此枚举表示的内容。很明显,它一开始表示一个状态,同时激活淡入、淡出和淡出完成并没有多大意义。请小心避免添加真正应该是单独属性的枚举成员。现在删除[Flags],问题解决了。@Hans Passant我想你是对的,最好把它分成两个独立的枚举。我仍然需要[Flags],因为有些东西可以设置PASSRENDER和PASSUPDATE,或者只设置一个。