繁体   English   中英

枚举的标志和非标志变体

[英]Flags- and non-flags-variant of an enum

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

  • 选项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;

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

我只想将[Flags]版本用于所有内容,并且只需在几个地方确保它只是一个值。 要这样做,因为即使没有[Flags] ,以下内容也是有效的:

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

所以,你需要检查的Color是一个你无论如何都期待。 [Flags]只会帮助序列化/解析。

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

最近我遇到了同样的问题。 选项2解决,简单检查:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM