通常在比较标志枚举时,我使用以下格式:
(value & flag) == flag;
但有时我会遇到这样的情况:
(value & flag) != 0;
只是想知道哪个更好用,还是归结为个人喜好?
通常在比较标志枚举时,我使用以下格式:
(value & flag) == flag;
但有时我会遇到这样的情况:
(value & flag) != 0;
只是想知道哪个更好用,还是归结为个人喜好?
如果您使用的是 .net 4 或更高版本,请改用Enum.HasFlag
事实上,这种方法使用第一种检查方式,但提供了更清晰的方式来检查标志
只要flag
是一位标志,它们是等价的。如果flag
有多个位,
(value & flag) == flag;
是逻辑与(所有位必须匹配),而
(value & flag) != 0;
是逻辑或(任何位都必须匹配)。
这只是个人喜好。
两者的性能将大致相同,结果将始终相同。(假设是单线程环境。)
我猜第二个示例复制/粘贴更容易一些。
第二个示例对于跨线程问题的影响也较小(如果flag
在表达式中间发生突变,则第一个示例中可能会发生奇怪的事情)。
如果您要根据复合标志检查值,例如 value: 0x0111
, flags:0x0101
则(value & flags) == flags
表示“设置了所有标志”,并(value & flags) != 0
表示“设置了任何标志”。