2010-04-16 230 views
0

我有这样的代码:需要在C#旗澄清

[Flags] 
public enum MyUriType { 
    ForParse, 
    ForDownload, 
    Unknown 
} 

然后:

MyUriType uriType = MyUriType.ForDownload; 

,但是,我想知道为什么这个返回true:

if ((uriType & MyUriType.ForParse) == MyUriType.ForParse) 

当它是未在第二个代码组中设置。请指教。

回答

8

默认情况下,enum类型的第一个字段的序号值为0

所以,如果uriType不包含MyUriType.ForParse标志,那么uriType & MyUriType.ForParse实际上等于0,当你把它比作MyUriType.ForParse平等(这也是0),这违反直觉的计算结果为true

如果你打破它按位运算,那么你正在评估的表达式为:

({something} & 0) == 0 

...这将始终评估为true,无论是“东西”是什么。

通常情况下,当你定义一个Flags枚举,你实际上应该为每个字段的值:

[Flags] 
public enum MyUriTypes 
{ 
    None = 0, 
    ForParse = 1, 
    ForDownload = 2, 
    ForSomethingElse = 4, 
    ForAnotherThing = 8 
} 

每个值应该是2的力量,使他们不冲突(2每倍数为一个二进制左移)。

这也是习惯它的名字作为复数,让谁使用枚举的人都知道,这是一个Flags枚举,可以/应该有多个值。

如果以这种方式定义您的枚举,那么如果uriType没有设置ForParse位,则您的测试代码现在将计算为false

+0

+1。成像为“表情魔力数字”:) – 2010-04-16 02:36:58

+1

对于有很多字段的枚举,可以使用十六进制文字来简化赋值:... ForAnotherThing = 0x8,ForThatOneOtherThing = 0x10,OhYeahAndThatThing = 0x20等。 – 2010-04-16 02:42:41

+0

感谢Aaronaught。 – Jojo 2010-04-16 02:42:45

0

你应该在2般的权力定义它:

[Flags] 
public enum MyUriType { 
None = 0 
ForParse = 1, 
ForDownload = 2, 
Unknown = 4 
} 

注意,当你想到的选项的组合将设置标志是适当的(例如ForParse +未知或ForDownload +未知)。如果一次只有一个选项适用,则可以使用常规枚举。