首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何比较C#中的标志?

如何比较C#中的标志?
EN

Stack Overflow用户
提问于 2008-09-02 18:28:17
回答 8查看 88.4K关注 0票数 161

我在下面有一个标志枚举。

代码语言:javascript
复制
[Flags]
public enum FlagTest
{
    None = 0x0,
    Flag1 = 0x1,
    Flag2 = 0x2,
    Flag3 = 0x4
}

我不能使if语句的计算结果为true。

代码语言:javascript
复制
FlagTest testItem = FlagTest.Flag1 | FlagTest.Flag2;

if (testItem == FlagTest.Flag1)
{
    // Do something,
    // however This is never true.
}

我如何才能实现这一点呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-11-20 19:04:36

在.NET 4中有一个新的方法Enum.HasFlag。这允许您编写以下代码:

代码语言:javascript
复制
if ( testItem.HasFlag( FlagTest.Flag1 ) )
{
    // Do Stuff
}

它的可读性更好,IMO。

.NET源表明这与接受的答案执行相同的逻辑:

代码语言:javascript
复制
public Boolean HasFlag(Enum flag) {
    if (!this.GetType().IsEquivalentTo(flag.GetType())) {
        throw new ArgumentException(
            Environment.GetResourceString(
                "Argument_EnumTypeDoesNotMatch", 
                flag.GetType(), 
                this.GetType()));
    }

    ulong uFlag = ToUInt64(flag.GetValue()); 
    ulong uThis = ToUInt64(GetValue());
    // test predicate
    return ((uThis & uFlag) == uFlag); 
}
票数 328
EN

Stack Overflow用户

发布于 2008-09-02 18:31:53

代码语言:javascript
复制
if ((testItem & FlagTest.Flag1) == FlagTest.Flag1)
{
     // Do something
}

(testItem & FlagTest.Flag1)是一个按位AND运算。

FlagTest.Flag1等同于带有OP枚举的001。现在假设testItem有Flag1和Flag2 (所以它是按位101):

代码语言:javascript
复制
  001
 &101
 ----
  001 == FlagTest.Flag1
票数 184
EN

Stack Overflow用户

发布于 2009-11-20 19:12:51

对于那些难以可视化所接受的解决方案所发生的事情的人(这就是),

代码语言:javascript
复制
if ((testItem & FlagTest.Flag1) == FlagTest.Flag1)
{
    // Do stuff.
}

testItem (根据问题)被定义为,

代码语言:javascript
复制
testItem 
 = flag1 | flag2  
 = 001 | 010  
 = 011

然后,在if语句中,比较的左侧是,

代码语言:javascript
复制
(testItem & flag1) 
 = (011 & 001) 
 = 001

以及完整的if语句(如果在testItem中设置了flag1,则计算结果为true ),

代码语言:javascript
复制
(testItem & flag1) == flag1
 = (001) == 001
 = true
票数 79
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档