MSDN documentation属性的Flag
说您应该:
以2的幂定义枚举常数,即1、2、4、8,等等。这意味着组合枚举中的各个标志常量不重叠。
...当然,我总是尽量记住要这样做。但是,没有什么可以强制执行的,并且如果您仅以“基本”方式创建枚举,如...
[Flags]
public enum BrokenEnum
{
None,
FirstOption,
SecondOption,
ThirdOption
}
...它不会表现出预期的效果。为了解决这个问题,我正在寻找某种静态代码分析(例如FxCop),当我的代码中存在上述枚举之类时,它可以警告我。我能找到的最接近这样的警告是'CA1008: Enums should have zero value'-这对于正确设计标志枚举也很有帮助,但还不够。
在我的代码中找到设计不正确的标志枚举的最佳方法是什么?解决方案越自动化,就越好。
正如雅各布所说,将标志混合在一起是很有用的……但是您可能会以某种方式指出这一点,这样您就不会在意检测了。
[编写一个通过[Flags]
装饰的程序集中的每个枚举并检查是否存在0值(可以确保将其称为None
或Default
)的单元测试应该不太困难。其他每个定义的值(来自Enum.GetValues()
)均为2的幂。您可以使用if ((x & (x - 1)) == 0)
进行检查。
[您可能具有属性[Combination]
之类的东西来指示被设计为组合的值...它们甚至可以指示它们要组合的标志名,因此您也可以进行检查。
我知道这不如编译时检查好,但是假设您已经在定期运行测试,那就非常接近了。
有时您想拥有一个代表多个选项的标志枚举;在这种情况下,这不是错误。这是一个常见的示例:
[Flags]
public enum FilePermissions
{
None = 0,
Read = 1,
Write = 2,
Execute = 4,
ReadWrite = 3, // Read | Write,
ReadWriteExecute = 7 // Read | Write | Execute
}
也许是因为需要支持这样的情况,所以编译器不会引起警告或错误。
我从未亲自尝试过,但也许您可以为FxCop编写自定义规则。
Menees Analyzers为此提供了样式规则,MEN012:
http://www.menees.com/index.html
其慈善软件,在NuGet上可用:https://www.nuget.org/packages/Menees.Analyzers/