2011-05-22 46 views
3

这是更多的问题,我要求了解而不是找出问题。考虑以下两种:这两个枚举[标志]声明(C#)之间的区别是什么

[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,不能使用一组不同的标志的组合被证明)

+0

显示代码,其中删除被评估为两个Pass? – 2011-05-22 13:57:15

+2

'[Flags]'属性不会神奇地将枚举转换为二进制枚举。 – BoltClock 2011-05-22 13:58:36

+2

你应该重新思考这个枚举代表什么。显然,它开始代表一个状态,淡入,淡出和淡入完成同时处于活动状态没有什么意义。小心避免添加真正应该是单独属性的枚举成员。现在删除[标志],问题解决了。 – 2011-05-22 15:36:13

回答

12

没有明确的数字,每一次(指定即使[Flags])枚举递增1,这样就可以获得:

[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的按位标记)

+0

感谢您的解释! – tweetypi 2011-05-22 23:36:10