[英]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 編寫自定義規則。
正如雅各布所說,混合標志可能很有用……但您可能可以以某種方式表明這一點,這樣您的檢測就不會介意。
編寫一個單元測試應該不會太難,它通過用[Flags]
裝飾的程序集中的每個枚舉並檢查是否有 0 的值(可能確保它被稱為None
或Default
)以及每個其他定義的值(來自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.