2013-10-18 133 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;