枚举的标志和非标志变体
本文关键字:标志 枚举 | 更新日期: 2023-09-27 18:21:24
假设我在标志和非标志变体中都需要一个枚举。
-
选项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.Red
和Colors.Red
完全不相关,这可能需要绑定代码。此外,我必须保持两个枚举同步。选项2的缺点是显而易见的。我真正想要的是类似的东西
enum Colors = Flag set of Color;
对于这一要求,有没有更巧妙的解决方案?
我只需对所有内容使用[Flags]
版本,并在少数地方确保它只是一个值。无论哪种方式,您都需要,因为即使没有[Flags]
,以下内容也是有效的:
var flags = (Color)47; // why not
因此,您需要检查Color
是否是您所期望的。[Flags]
只会帮助序列化/解析。
选项2唯一可能的缺点是位不足。如果这是你的问题,那么flags枚举根本不适合你。相反,将支持的颜色设为HashSet<Color>
最近我遇到了同样的问题。通过选项2解决,只需简单检查:
bool IsColorValid(Color color)
{
return (color != 0 && (color & (color - 1)) == 0);
}
绝对不要生成两个名为Color和Colors的枚举(选项1)。这将使您的代码非常混乱
除非我遗漏了什么,否则我不认为选项2这么难看。通常,在运行时设置系统参数之前,将其初始化为默认值"None"是合理的。