HasFlag always returns True

前端 未结 5 647
有刺的猬
有刺的猬 2021-01-06 07:39

There is a way to check if I got a flag in a series of flag?

Example:

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

}
// check if          


        
相关标签:
5条回答
  • 2021-01-06 08:16

    If you want to use this as FLAGS I believe your declaration is wrong. Check out this previous post. Because of the default incrementing, HasFlag won't work as you expect unless you set the values to powers of 2.

    What does the [Flags] Enum Attribute mean in C#?

    0 讨论(0)
  • 2021-01-06 08:21

    You can do bitwise operation like this:

    var alive = TestEnum.Alive;
    var hurt = TestEnum.Hurt;
    var aliveAndHurt = alive & hurt;
    
    0 讨论(0)
  • 2021-01-06 08:22

    I think you are making a game, so you should make a class for this issue

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

    Later you could check your states like this:

    if (player.isAlive && player.isHurt)
    {
     //dosomething
    }
    
    0 讨论(0)
  • 2021-01-06 08:22

    You can use Enum.HasFlag to check for this.

    bool aTest2 = aTest.HasFlag(TestEnum.ALIVE);
    
    0 讨论(0)
  • 2021-01-06 08:28

    You can certainly use Enum.HasFlag like everyone has suggested. However, its important to make sure that your enumeration falls in powers of two. Powers of two have a single bit set, so your enumeration should look like this:

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

    The reason this is important is because you are comparing the bit flags. In memory, your enum flags will look like this:

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

    When you do a bitwise compare, like DEAD | ALMOSTDEAD, you are doing this:

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

    Since the Result is > then 0, its true.

    0 讨论(0)
提交回复
热议问题