簡體   English   中英

標記沒有兩個值冪的枚舉

[英]Flag enums without power of two values

Flag屬性的MSDN 文檔說您應該:

以 2 的冪定義枚舉常量,即 1、2、4、8 等。 這意味着組合枚舉常量中的各個標志不會重疊。

...當然,我總是盡量記住這樣做。 但是,沒有什么可以強制執行的,如果您只是創建一個枚舉,就像這樣的“基本”方式......

[Flags]
public enum BrokenEnum
{
    None,
    FirstOption,
    SecondOption,
    ThirdOption
}

...它不會按預期運行。 為了解決這個問題,我正在尋找某種靜態代碼分析(如FxCop ),當我的代碼中存在像上面那樣的枚舉時,它可以警告我。 我能找到的最接近的警告是“ CA1008: Enums should have zero value ”——這也有助於正確設計標志枚舉,但還不夠。

在我的代碼中查找錯誤設計的標志枚舉的最佳方法是什么? 解決方案自動化程度越高越好。

有時你想要一個代表多個選項的標志枚舉; 在這種情況下,這不是錯誤。 這是一個常見的例子:

[Flags]
public enum FilePermissions
{
    None = 0,
    Read = 1,
    Write = 2,
    Execute = 4,

    ReadWrite = 3, // Read | Write,
    ReadWriteExecute = 7 // Read | Write | Execute
}

也許是因為需要支持這樣的情況,這就是編譯器不會導致警告或錯誤的原因。

我自己從未嘗試過,但也許您可以為 FxCop 編寫自定義規則。

檢查FxCop 和代碼分析:編寫您自己的自定義規則

正如雅各布所說,混合標志可能很有用……但您可能可以以某種方式表明這一點,這樣您的檢測就不會介意。

編寫一個單元測試應該不會太難,它通過用[Flags]裝飾的程序集中的每個枚舉並檢查是否有 0 的值(可能確保它被稱為NoneDefault )以及每個其他定義的值(來自Enum.GetValues() ) 是 2 的冪。 您可以使用if ((x & (x - 1)) == 0)

您可能有類似屬性[Combination]東西來指示設計為組合的值……它們甚至可以指示它們要組合的標志名稱,因此您也可以檢查它。

我知道這不如編譯時檢查好,但假設您已經在定期運行測試,它非常接近。

Menees Analyzers為此提供了樣式規則MEN012:

http://www.menees.com/index.html

它的慈善軟件,可以在NuGet上找到: https ://www.nuget.org/packages/Menees.Analyzers/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM