c# - 枚举的标志和非标志变体

标签 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 完全无关,这可能需要绑定(bind)代码。此外,我必须使两个枚举保持同步。选项 2 的缺点是显而易见的。我真正想要的是

enum Colors = Flag set of Color;

是否有针对此要求的更优雅的解决方案?

最佳答案

我会简单地对所有内容使用 [Flags] 版本,并简单地确保在几个地方它只是一个值。无论哪种方式,您需要都这样做,因为即使没有[Flags],以下内容也是有效的:

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

所以您需要检查 Color 是否是您所期望的无论如何[Flags] 只会帮助序列化/解析。

关于c# - 枚举的标志和非标志变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9016453/

相关文章:

java - 将 Ordinal Enum 值设置为从 1 而不是 0 开始

c# - 是否可以使用 C# 检查是否启用了硬件虚拟化?

c# - Interlocked.Exchange 有多安全?

c - 更好地设计子分支 if 语句子条件

python - 在 Django 模型中指定 mySQL ENUM

c++ - 将 "enum: int64_t"值写入 std::ostringstream 会将其截断为 int

C# facebook graph/如何在 Facebook 相册上上传图片?

c# - DbContext -> DbSet -> Where 子句丢失( Entity Framework 6)

c++ - C++ 中的根命名空间编码约定

c++ - 使用 '&&' 而不是 'and' 运算符编码