Эффективное использование перечислений - PullRequest
5 голосов
/ 19 сентября 2011

Я прочитал книгу, где автор делает это:

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 ]

8 голосов
/ 19 сентября 2011

Это перечисление, в котором значения можно использовать с побитовыми операторами. Это позволяет для значения enum быть комбинацией нескольких значений. Например

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 голос
/ 19 сентября 2011

Это связано с масками.Таким образом, вы можете представить, может ли он ползти и плавать, a=(crawl | swim).Тогда вы можете проверить людей по a&swim.

1 голос
/ 19 сентября 2011

Это так, что вы можете комбинировать их с побитовыми операторами. Я не уверен, что это имеет смысл с Move, но это имеет смысл с другими вещами.

0 голосов
/ 19 сентября 2011

<< является (редактировать) оператором левого сдвига. </p>

Он делает это, чтобы он мог объединить несколько значений Move, используя побитовые операторы, хотя имена немного плохой пример.

Допустим, у меня есть

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

Теперь я хочу создать метод Depot.RetrieveVehicles (тип VehicleType);

Поскольку значения заданы таким образом, я могу сделать

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

Для поиска транспортных средств, которые являются либо автомобилями, либо фургонами.

So Car (001) |Ван (010) дает вам 011 в двоичном виде.

Просто, чтобы немного прояснить ситуацию, я мог бы также сделать следующее:

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

Вы не можете сделать это легко, если вы только что использовали 0, 1,2.Вам придется вызывать этот метод дважды.

0 голосов
/ 19 сентября 2011

Поскольку вы можете использовать тип перечисления в качестве флагов.

Это означает, что вы можете объединить некоторые перечисляемые значения определения в одну переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...