繁体   English   中英

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

[英]Is there any reason to use enum params over bit flags in c#?

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

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

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

它们有不同的含义。 标志的特征在于将它们组合在一起是有意义的; 枚举只是离散的数据块,它们在幕后是数字的事实只不过是一个实现细节。

如果您使用对 OR 两个一起没有意义的标志,您将严重误导任何使用您的数据类型的人。 相反,如果您在表示标志的地方使用枚举,那么您将不得不手动捕获并以指数方式命名许多枚举案例。

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

位标志的优点:

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

2)您可以在一个变量中存储多个值(因此不需要数组)。 这在 memory 绑定操作中可能很重要。

3) Enum.HasFlag方法存在,因此您实际上不必实现 static class。

缺点:

1)您不能在标志中存储相同值的多个实例 - 开/关。 您的数组可能有多个相同值的实例。

2) 如果需要,必须单独检查 Any = 0值。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM