9

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

(value & flag) == flag;

但有时我会遇到这样的情况:

(value & flag) != 0;

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

4

4 回答 4

17

如果您使用的是 .net 4 或更高版本,请改用Enum.HasFlag

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

于 2012-11-26T15:32:28.890 回答
11

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

(value & flag) == flag;

是逻辑与(所有位必须匹配),而

(value & flag) != 0;

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

于 2012-11-26T15:35:01.503 回答
4

这只是个人喜好。

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

我猜第二个示例复制/粘贴更容易一些。

第二个示例对于跨线程问题的影响也较小(如果flag在表达式中间发生突变,则第一个示例中可能会发生奇怪的事情)。

于 2012-11-26T15:32:02.477 回答
2

如果您要根据复合标志检查值,例如 value: 0x0111, flags:0x0101(value & flags) == flags表示“设置了所有标志”,并(value & flags) != 0表示“设置了任何标志”。

于 2012-11-26T15:35:03.377 回答