4

有一种方法可以检查我是否在一系列标志中获得了一个标志?

例子:

[Flags]
Enum TestEnum
{
  ALIVE, DEAD, ALMOSTDEAD, HURT, OTHERS

}
// check if is alive and has been hurt
TestEnum aTest = TestEnum.ALIVE | TestEnum.HURT
bool aTest2 = aTest.HasFlag(TestEnum.ALIVE)

a.Test.HasFlag总是返回 true,即使没有 TestEnum.ALIVE

4

5 回答 5

12

您当然可以像每个人建议的那样使用Enum.HasFlag 。但是,重要的是要确保您的枚举符合 2 的幂。2 的幂只有一个位集,因此您的枚举应如下所示:

Enum TestEnum
{
    ALIVE = 1, DEAD = 2, ALMOSTDEAD = 4, HURT = 8, OTHERS = 16
}

这很重要的原因是因为您正在比较位标志。在内存中,您的枚举标志将如下所示:

ALIVE      = 00001
DEAD       = 00010
ALMOSTDEAD = 00100
HURT       = 01000
OTHERS     = 10000

当您进行按位比较时,例如DEAD | ALMOSTDEAD,您正在这样做:

DEAD       = 00010
           OR
ALMOSTDEAD = 00100
------------------
RESULT     = 00110

由于结果>然后为0,因此为真。

于 2013-10-18T20:38:26.803 回答
1

如果您想将其用作 FLAGS,我相信您的声明是错误的。看看这个以前的帖子。由于默认递增,除非您将值设置为 2 的幂,否则 HasFlag 不会按预期工作。

C# 中的 [Flags] 枚举属性是什么意思?

于 2013-10-18T20:30:17.463 回答
0

我认为您正在制作游戏,因此您应该为此问题开设课程

public class Player
{
    bool isAlive;
    bool isHurt;
...
}

稍后您可以像这样检查您的状态:

if (player.isAlive && player.isHurt)
{
 //dosomething
}
于 2013-10-18T20:30:32.890 回答
0

您可以像这样进行按位运算:

var alive = TestEnum.Alive;
var hurt = TestEnum.Hurt;
var aliveAndHurt = alive & hurt;
于 2013-10-18T20:30:39.583 回答
-1

您可以使用Enum.HasFlag来检查这一点。

bool aTest2 = aTest.HasFlag(TestEnum.ALIVE);
于 2013-10-18T20:29:10.177 回答