我读了一本作者这样做的书:
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 ...
答案 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,则无法轻松完成此操作。你必须两次调用该方法。