C# 比较标志枚举的更好方法是什么?

C# 比较标志枚举的更好方法是什么?,c#,C#,通常,在比较标志枚举时,我使用以下格式: (value & flag) == flag; 但有时我会遇到这样的情况: (value & flag) != 0; 只是想知道哪个更好用,还是归结到个人喜好上?这只是个人喜好 两者的性能将大致相同,结果将始终相同。(假设为单线程环境。) 我想,第二个示例的复制/粘贴更容易一些 第二个例子也是一个不太难于解决线程问题的代码(如果代码“>标志/代码>在表达式的中间发生了变异,首先可能会发生奇怪的事情。 如果您使用.NET 4或更高的使用

通常,在比较标志枚举时,我使用以下格式:

(value & flag) == flag;
但有时我会遇到这样的情况:

(value & flag) != 0;

只是想知道哪个更好用,还是归结到个人喜好上?

这只是个人喜好

两者的性能将大致相同,结果将始终相同。(假设为单线程环境。)

我想,第二个示例的复制/粘贴更容易一些


第二个例子也是一个不太难于解决线程问题的代码(如果代码“>标志/代码>在表达式的中间发生了变异,首先可能会发生奇怪的事情。

如果您使用.NET 4或更高的使用而不是


实际上,该方法使用第一种检查方法,但提供了更清晰的方法来检查标志

,只要
标志
是一位标志,它们是等效的。如果
标志
有多个位

(value & flag) == flag;
是逻辑AND(所有位必须匹配),而


是逻辑OR(任何位都必须匹配)。

如果要根据复合标志检查值,例如值:
0x0111
,标志:
0x0101
,则
(值和标志)==标志
表示“已设置所有标志”,并且
(值和标志)!=0
表示“已设置任何标志”。

我使用单独的帮助器方法替换了任何这些方法(包括
Enum.hasvag
)的使用,从而产生更干净的API使用并减少代码重复。请看:自从我开始使用雨果的扩展修改后,感觉好多了这比上面的操作要慢!是的,它可能会慢一些,但大多数情况下,如果我们从性能与清晰代码的角度来看,它没有意义。请注意,这种方法相当于原始文章中的第一行。如果
flag
不是一个单位值(即不是2的幂,或者
MinValue
对于有符号基础整数),这很重要(参见其他答案)。是的,它只是隐藏方法后面的第一行并进行一些检查。在帖子中补充道,感谢你用这件显而易见的事情为我省去了麻烦:)投了赞成票,但你应该编辑以放入所需的括号。
(value & flag) != 0;