c# - 在 C# 中是否有任何理由使用枚举参数而不是位标志?

标签 c# enums parameters bitwise-and bitflags

例如,我有两种实现,一种带有位标志,另一种带有简单枚举:

1) 位标志

[Flags]
public enum LettersBitFlags
{
    A = 1,
    B = 2,
    C = 4,
    D = 8
}
public static bool IsLetterBBitFlags(LettersBitFlags letters)
{
    return (letters & LettersBitFlags.B) != 0;
}

2) 简单枚举

public enum Letters
{
    A,
    B,
    C,
    D
}
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

是否有任何实际理由选择其中之一?正如我所看到的,它们给出了相同的结果,但也许某些性能或其他任何东西应该让我使用一个而不使用另一个?

最佳答案

它们有不同的含义。标志的特点是对它们进行“或”运算才有意义;枚举只是离散的数据 block ,它们在幕后是数字的事实只不过是一个实现细节。

如果您使用的标志对于“或”两个组合而言没有意义,那么您将严重误导任何使用您的数据类型的人。相反,如果您在想要标记的地方使用枚举,那么您将必须手动捕获并命名数量呈指数级增长的枚举案例。

关于c# - 在 C# 中是否有任何理由使用枚举参数而不是位标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62117318/

相关文章:

java - 具有抽象函数的 Java 枚举有哪些非抽象版本不能做的事情? (即是否存在技术差异,或者只是一种模式?)

C++:如何在声明它的模板类主体之外定义枚举类?

java - 为什么我们不允许在java中重写枚举中的hashcode

linux - 程序参数中参数扩展的奇怪行为

c# - Pinging 域 C#

c# - 如何从 WPF ToggleButton 中删除默认镶边

java - 'void' 方法什么时候影响参数,什么时候影响原始对象?

java - 了解 Java 在用作方法参数时如何处理对象

c# - 为什么 volatile 变量通常是私有(private)的?

c# - 一个根应该用于整个聚合图,还是多个根应该在同一图中?