枚举的标志和非标志变体

时间:2012-01-26 10:03:57

标签: c# coding-style enums

假设我需要在标志和非标志变体中同时使用枚举。

  • 选项1:我可以复制所有内容:

    enum Color { Red, Blue, Green }
    
    [Flags]
    enum Colors {
        None = 0,
        Red = 1,
        Blue = 2,
        Green = 4
    }
    
    // use cases
    Color currentColor;
    Colors supportedColors;
    
  • 选项2:我可以将Flags变体用于所有内容:

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

我不喜欢其中任何一个:在选项1中,Color.RedColors.Red完全不相关,这可能需要绑定代码。另外,我必须保持两个枚举同步。选项2的缺点是显而易见的。我真正喜欢的是像

enum Colors = Flag set of Color;

这个要求是否有更优雅的解决方案?

4 个答案:

答案 0 :(得分:5)

我只需将[Flags]版本用于所有内容,只需在几个地方确保它只是一个值。您需要以这种方式执行此操作,因为即使没有[Flags],以下内容也是有效的:

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

因此,您需要检查Color是否是您期望的 [Flags]只会帮助序列化/解析。

答案 1 :(得分:2)

选项2唯一可能的缺点是用完了比特。如果这是你的问题,那么标志枚举根本不适合你。而是将支持的颜色设为HashSet<Color>

答案 2 :(得分:2)

最近我遇到了同样的问题。通过选项2解决,只需检查:

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

答案 3 :(得分:1)

绝对不要制作两个名为Color and Colors的枚举(选项1)。这会使您的代码非常混乱。

除非我遗漏了什么,否则我认为选项2不是那么难看。通常,在运行时设置之前将系统参数初始化为默认值“None”是合理的。