有效的枚举使用

时间:2011-09-19 15:47:37

标签: 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
}  

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

5 个答案:

答案 0 :(得分:8)

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

Move crawlAndSwim = Move.crawl | Move.swim;

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

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

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

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

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

答案 1 :(得分:1)

它可以将它们与按位运算符组合在一起。我不确定Move是否完全合理,但对其他事情也有意义。

答案 2 :(得分:1)

它与面具有关。 通过这种方式,您可以表示a=(crawl | swim)是否可以抓取并游泳。 然后,您可以a&swim检查个人。

答案 3 :(得分:0)

因为你可以使用枚举类型作为标志。

这意味着您可以将定义的一些枚举值组合到一个变量中。

答案 4 :(得分:0)

&LT;&LT;是一个(编辑)左移运算符。

他这样做,所以他可以使用按位运算符组合Move的多个值,尽管这些名称有点不好。

让我说我有

public enum VehicleType{
  Car = 1<<0,
  Van = 1<<1,
  Truck = 1<<2
}

现在我想制作一个方法Depot.RetrieveVehicles(VehicleType type);

因为这些值是以这种方式设置的,所以我可以

Depot.RetrieveVehicles(VehicleType.Car | VehicleType.Van); 

检索汽车或货车的车辆。

所以Car(001)|范(010)给你二进制011。

为了清楚一点,我也可以这样做:

public enum VehicleType{
  Car = 1, //001
  Van = 2, //010
  Truck = 4//100
}

如果您刚刚使用0,1,2,则无法轻松完成此操作。你必须两次调用该方法。