什么';这两个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,或者只设置一个。