是否有任何理由在c#中的位标志上使用枚举参数?

是否有任何理由在c#中的位标志上使用枚举参数?,c#,enums,parameters,bitwise-and,bitflags,C#,Enums,Parameters,Bitwise And,Bitflags,比如说,我有两个实现,一个带有位标志,另一个带有简单枚举: 1) 位标志 [Flags] public enum LettersBitFlags { A = 1, B = 2, C = 4, D = 8 } 2) 简单枚举 public enum Letters { A, B, C, D } 它们显然可以这样使用: Console.WriteLine(IsLetterBBitFlags(LettersBitFlags.A | L

比如说,我有两个实现,一个带有位标志,另一个带有简单枚举:

1) 位标志

[Flags]
public enum LettersBitFlags
{
    A = 1,
    B = 2,
    C = 4,
    D = 8
}
2) 简单枚举

public enum Letters
{
    A,
    B,
    C,
    D
}
它们显然可以这样使用:

Console.WriteLine(IsLetterBBitFlags(LettersBitFlags.A | LettersBitFlags.D)); //false
Console.WriteLine(IsLetterBBitFlags(LettersBitFlags.B | LettersBitFlags.C)); //true

Console.WriteLine(IsLetterBParams(Letters.A, Letters.D)); //false
Console.WriteLine(IsLetterBParams(Letters.B, Letters.C)); //true

有什么实际的理由选择一个而不是另一个吗?如我所见,它们给出了相同的结果,但可能是某些性能或其他原因使我使用了其中一个,而没有使用另一个?

当您以某些字节/整数位表示数据时,第一个选项很好,数据可能包含一个或多个枚举值,然后您可以检查数据是否具有标志。

它们有不同的含义。旗帜的特点是,将它们放在一起是有意义的;枚举只是离散的数据块,它们是数字的事实只是一个实现细节


如果您使用的标志对其中一个或两个没有意义,那么您将严重误导任何使用您的数据类型的人。相反,如果您使用的枚举指的是标志,则必须手动捕获并以指数形式命名许多枚举案例。

位标志的优点:

1) flags属性提供了比枚举数组更好的ToString()行为

2) 可以在一个变量中存储多个值(因此不需要数组)。这在内存受限的操作中可能很重要

3) 方法
Enum.HasFlag
存在,因此实际上不必实现静态类

缺点:

1) 不能将同一值的多个实例存储在标志-on/off中。您的数组可以有多个相同值的实例

2) 如果需要,任何
=0
值都必须单独检查


3) 在我的选项中,当使用位标志时,并不总是很清楚你在做什么-你需要一个额外的知识元素。

什么
=0
你的意思是什么?如果你使用标志,你可能需要一个
None=0
选项-这不是一个标志,尽管你必须与你的逻辑的其余部分分开检查。
public static bool IsLetterBParams(params Letters[] letters)
{
    return letters.Any(x => x == Letters.B);
}
Console.WriteLine(IsLetterBBitFlags(LettersBitFlags.A | LettersBitFlags.D)); //false
Console.WriteLine(IsLetterBBitFlags(LettersBitFlags.B | LettersBitFlags.C)); //true

Console.WriteLine(IsLetterBParams(Letters.A, Letters.D)); //false
Console.WriteLine(IsLetterBParams(Letters.B, Letters.C)); //true