【问题标题】:How to check if an enum flag is raised alongside with another enum?如何检查枚举标志是否与另一个枚举一起出现?
【发布时间】:2011-05-30 20:04:56
【问题描述】:

我有以下枚举:

[Flags]
public enum Permissions
{
    None = 0x0000,
    All = 0xFFFF
}

如果引发了 None 或 All ,则不应引发其他标志。
如何检查是否引发了 None 或 All ,而没有其他问题?

【问题讨论】:

  • 您没有正确使用Flags 属性。该属性适用于作为位掩码实现的枚举,如果您的枚举是位掩码,那么您不需要问这个问题,因为None 将是0All 将是0xFFFF
  • 如果正确使用 used Flags 则 None 将具有掩码 0000...0 并且 All 将具有掩码 1111...1,这意味着 All 对应于所有设置的标志和 None没有设置任何标志。

标签: c# .net enums flags


【解决方案1】:

在标志枚举中,None 应该是零,All 应该是累积的按位和。这使得数学很容易,然后:

if(value == Permissions.None || value == Permissions.All) {...}

如果你愿意,可以写成switch...

但是,在一般的情况下,您可以使用以下方法测试完整的标志匹配(针对任意数量的位):

if((value & wanted) == wanted) {...}

并测试任何重叠(即任何公共位 - wanted 必须为非零):

if((value & wanted) != 0) {...}

【讨论】:

  • 谢谢!这对我来说是一个完全陌生的概念,但却是该语言的一个非常酷的特性。感谢您的澄清。从来没有在 Java 中做太多的 AND'ing 或 OR'ing :)
【解决方案2】:
if(value|Permissions.None)==Permissions.None;

这可以检查 Permissions.None 被提出。其余的可以用同样的方式完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多