2012-11-06 29 views
2

我有一個enum這是以下列方式聲明(但有更多的選擇 - 約15左右),因爲我想要一個簡單的方法來定義所有選項,而無需明確列出它們。爲標誌類枚舉定義「catchall」是否明智?

[Flags] 
enum Options 
{ 
    Option1 = 1, 
    Option2 = 2, 
    Option3 = 4, 
    Option4 = 8, 
    AllOptions = 15 
} 

所以這與其說

Options foo = Options.Option1 | Options.Option2 | Options.Option3 |... ad nauseum 

我只能說

Options foo = Options.AllOptions; 

這是明智的?或者,有沒有更好的方式給變量提供所有可用的選項而不必明確列出它們?

回答

6

或者有沒有更好的方法給變量所有可用的選項,而不必明確列出它們?

嗯,你可以用我的Unconstrained Melody項目:

Options allOptions = Flags.GetUsedBits<Options>(); 

(有那麼各種可以使用無約束的旋律做其他操作)

個人而言,我會盡量避免儘管硬編碼「全部」值 - 但添加新值並忘記更新「全部」值會非常容易。

(我也想避免在此情況下,將其命名爲AllOptions - 它應該只是All,以避免Options.AllOptions冗餘。)

如果做到這一點,添加一個單元測試,以確保你做對了:)

+0

我喜歡Unconstrained Melody的想法,尤其是將更多選項添加到列表中的事實將被自動包含在'allOptions'變量中。謝謝! –

4

你可以這樣做:

[Flags] 
enum Options 
{ 
    Option1 = 1, 
    Option2 = 2, 
    Option3 = 4, 
    Option4 = 8, 
    AllOptions = Option1 | Option2 | Option3 | Option4 
} 

這種方法的字面意思是選項1和選項與選項3和選項4。您可以使用此爲:

Options.AllOptions; 

Options.Option1 | Options.Option2 | Options.Option3 | Option.Option4 

上面兩種情況,最終將成爲相同的結果。