2013-10-18 134 views
2

有一种方法可以检查我是否在一系列标志中出现了一个标志?HasFlag总是返回True

例子:

[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

+0

是的。告诉我们你试过的东西。 – Chris

+2

检查文档? http://msdn.microsoft.com/en-us/library/system.enum.hasflag.aspx – mayabelle

+0

我试图惠特hasFlag,但它总是返回true,也没有TestEnum.ALIVE – Stickly

回答

6

你可以肯定地使用Enum.HasFlag像大家所建议的一样。但是,确保您的列举属于两个幂的重要。两种权力有一个位设置,让你的枚举应该是这样的:

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,其真实。

+1

一个简单的方法来做权力的两个在指定他们时使用'<<'运算符。 'Enum TestEnum ALIVE = 1 << 0,DEAD = 1 << 1,ALMOSTDEAD = 1 << 2,HURT = 1 << 3,OTHERS = 1 << 4 } –

-1

您可以使用Enum.HasFlag检查此。

bool aTest2 = aTest.HasFlag(TestEnum.ALIVE); 
0

权力,我认为你是一个游戏,因此你应该做一个类此问题HasFlag将无法正常工作

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

后来,你可以检查你的状态是这样的:

if (player.isAlive && player.isHurt) 
{ 
//dosomething 
} 
0

你可以逐位操作是这样的:

var alive = TestEnum.Alive; 
var hurt = TestEnum.Hurt; 
var aliveAndHurt = alive & hurt;