2010-04-16 248 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 +未知)。如果一次只有一個選項適用,則可以使用常規枚舉。