[英]Is there any reason to use a function with a void return over an Action in 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.