这两个枚举[Flags]声明(C#)之间有什么区别

时间:2011-05-22 13:54:47

标签: 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,
        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 个答案:

答案 0 :(得分:12)

如果没有明确的数字,枚举每次都会增加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的连续幂)