如何将枚举与标志组合?

boo*_*oop 6 c# enums

我有一个带标志的枚举.我想声明一个带有n不同标志的变量.n > 1在这种情况下.

public enum BiomeType {
    Warm = 1,
    Hot = 2,
    Cold = 4,
    Intermediate = 8,

    Dry = 16,
    Moist = 32,
    Wet = 64,
}
Run Code Online (Sandbox Code Playgroud)

好的 - 一个变体是将每个标志转换为一个字节并将结果转换为我的枚举.

BiomeType bType = (BiomeType)((byte)BiomeType.Hot + (byte)BiomeType.Dry)
Run Code Online (Sandbox Code Playgroud)

但这有点混乱 - imho.是否有更可读的方式来组合标志?

Pat*_*irk 10

简单,使用二进制"或"运算符:

BiomeType bType = BiomeType.Hot | BiomeType.Dry;
Run Code Online (Sandbox Code Playgroud)

此外,如果值可以像这样组合,最好使用Flags属性标记枚举以指示:

[Flags]
public enum BiomeType {
    Warm = 1,
    Hot = 2,
    Cold = 4,
    Intermediate = 8,
    Dry = 16,
    Moist = 32,
    Wet = 64,
}
Run Code Online (Sandbox Code Playgroud)

由于多种原因,添加枚举值很糟糕.它可以轻松生成超出定义值的值,即:

BiomeType bType = (BiomeType)((byte)BiomeType.Wet + (byte)BiomeType.Wet);
Run Code Online (Sandbox Code Playgroud)

设计时,此示例产生的值为128,不会映射到已知值.这仍然可以编译和运行,但是您可能没有构建代码来处理那些定义之外的值,并可能导致未定义的行为.但是,如果您使用管道(或"二进制或")运算符:

BiomeType bType = BiomeType.Wet | BiomeType.Wet;
Run Code Online (Sandbox Code Playgroud)

结果仍然是公正的BiomeType.Wet.

此外,在您的问题中使用添加不会在IDE中提供Intellisense,这使得使用枚举变得更加困难.