没有两个值的幂的枚举枚举

问题描述 投票:6回答:4

MSDN documentation属性的Flag说您应该:

以2的幂定义枚举常数,即1、2、4、8,等等。这意味着组合枚举中的各个标志常量不重叠。

...当然,我总是尽量记住要这样做。但是,没有什么可以强制执行的,并且如果您仅以“基本”方式创建枚举,如...

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

...它不会表现出预期的效果。为了解决这个问题,我正在寻找某种静态代码分析(例如FxCop),当我的代码中存在上述枚举之类时,它可以警告我。我能找到的最接近这样的警告是'CA1008: Enums should have zero value'-这对于正确设计标志枚举也很有帮助,但还不够。

在我的代码中找到设计不正确的标志枚举的最佳方法是什么?解决方案越自动化,就越好。

c# enums code-analysis static-analysis
4个回答
2
投票

正如雅各布所说,将标志混合在一起是很有用的……但是您可能会以某种方式指出这一点,这样您就不会在意检测了。

[编写一个通过[Flags]装饰的程序集中的每个枚举并检查是否存在0值(可以确保将其称为NoneDefault)的单元测试应该不太困难。其他每个定义的值(来自Enum.GetValues())均为2的幂。您可以使用if ((x & (x - 1)) == 0)进行检查。

[您可能具有属性[Combination]之类的东西来指示被设计为组合的值...它们甚至可以指示它们要组合的标志名,因此您也可以进行检查。

我知道这不如编译时检查好,但是假设您已经在定期运行测试,那就非常接近了。


3
投票

有时您想拥有一个代表多个选项的标志枚举;在这种情况下,这不是错误。这是一个常见的示例:

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

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

也许是因为需要支持这样的情况,所以编译器不会引起警告或错误。


3
投票

我从未亲自尝试过,但也许您可以为FxCop编写自定义规则。

检查FxCop and Code Analysis: Writing Your Own Custom Rules


0
投票

Menees Analyzers为此提供了样式规则,MEN012:

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

其慈善软件,在NuGet上可用:https://www.nuget.org/packages/Menees.Analyzers/

© www.soinside.com 2019 - 2024. All rights reserved.