有效的枚举使用

pok*_*222 5 c# enums

我读了一本作者这样做的书:

public enum Move
{  
    normal            = 0,
    swim              = 1 << 0,
    crawl             = 1 << 1,
    creep             = 1 << 3,
    jump              = 1 << 3,
    fly               = 1 << 4,
    grapple           = 1 << 5,
    goes_through_door = 1 << 6
}  
Run Code Online (Sandbox Code Playgroud)

为什么要这样做,为什么不让他们有默认值,如0,1,2,3 ......

Jar*_*Par 8

这是一个枚举,其中值可用于按位运算符.它允许枚举值为多个值的组合.例如

Move crawlAndSwim = Move.crawl | Move.swim;
Run Code Online (Sandbox Code Playgroud)

然后可以使用按位运算符来检查某些值的存在或不存在

if (0 != (aMoveValue & Move.crawl)) {
  // It's crawling
}

if (0 != (aMoveValue & Move.swim)) {
  // It's swiming
}
Run Code Online (Sandbox Code Playgroud)

维基百科有一篇关于这个主题的好文章,你可能会感兴趣

注意:正如casperOne指出的那样,这种类型的枚举定义应该使用FlagsAttribute进行注释,以表示它是标志/位域与正常位置.


Dan*_*ite 1

这样您就可以将它们与按位运算符组合起来。我不确定这对于 来说是否完全有意义Move,但对于其他事物来说却是有意义的。