2012-01-26 29 views
4

假設我需要在標誌和非標誌變體中都使用枚舉。枚舉的標誌和非標誌變體

  • 選項1:我可以複製的一切:

    enum Color { Red, Blue, Green } 
    
    [Flags] 
    enum Colors { 
        None = 0, 
        Red = 1, 
        Blue = 2, 
        Green = 4 
    } 
    
    // use cases 
    Color currentColor; 
    Colors supportedColors; 
    
  • 選項2:我可以只使用標誌變異的一切:

    Colors currentColor; // ugly, since neither "None" nor "Red | Blue" should be valid 
    

我不像以下任何一種:在選項1中,Color.RedColors.Red完全不相關,這可能需要禁止綁定代碼。另外,我必須保持兩個枚舉同步。選項2的缺點是顯而易見的。我實際上喜歡的是類似於

enum Colors = Flag set of Color; 

是否有更優雅的解決方案來滿足此要求?

+0

您可以請擴展用例嗎?你是否曾經需要比較'supportedColors'和'currentColor'? – Oded

+0

@Oded:是的,能夠做一些類似'bool currentColorIsSupported =(currentColor And supportedColor <> 0)'是很棒的事情。 – Heinzi

回答

5

我只是簡單地使用[Flags]版本的一切,只是確保在一些地方,它只是一個單一的值。您需要做到這一點無論哪種方式,因爲即使沒有[Flags]以下是有效的:

var flags = (Color)47; // why not 

所以你需要檢查Color是一個你期待反正[Flags]只會幫助序列化/解析。

2

選項2唯一可能的缺點是缺少位。如果這是你的問題,標誌枚舉根本不適合你。相反,使支持的顏色a HashSet<Color>

1

絕對不要做兩個名爲顏色和顏色(選項1)的枚舉。這會讓你的代碼非常混亂。

除非我失去了一些東西,我不認爲選項2是如此醜陋。通常,在運行時將系統參數初始化爲默認值「無」是合理的。

2

最近我有同樣的問題。通過選項2解決,通過簡單檢查:

bool IsColorValid(Color color) 
{ 
    return (color != 0 && (color & (color - 1)) == 0); 
}