Разница в тестировании для Enum Flags? - PullRequest
4 голосов
/ 23 сентября 2011

Глядя на другой вопрос, было любопытно, есть ли какая-либо разница (в работе или производительности) между этими двумя.

Учитывая:

[Flags]
enum TransportModes
{
   None = 0,
   Bus = 1,
   Train = 2,
   Plane = 4
}

И переменная

var trip = TransportModes.Bus | TransportModes.Train;
  1. if((trip & TransportModes.Bus) == TransportModes.Bus) ...

  2. if((trip & TransportModes.Bus)) != 0) ...

Я знаю, что они делают немного мудрои я знаю, что HasFlag заменяет их.Но Джон Скит рекомендует один, а документы MSDN рекомендуют другой.

Ответы [ 2 ]

2 голосов
/ 23 сентября 2011

Ваш второй параметр вернет true, если значения, которые вы дали своим значениям enum, не являются степенью двойки.Первый вариант не имеет этой проблемы.

Пример:

[Flags]
enum TransportModes
{
   None = 0,
   Bus = 1,
   Train = 2,
   Plane = 5
}

var trip = TransportModes.Bus | TransportModes.Train;

if((trip & TransportModes.Plane) != 0)
    // will be executed
if((trip & TransportModes.Plane) == TransportModes.Plane)
    // won't be executed

Объяснение:
trip & TransportModes.Plane равно 1, что, по-видимому, != 0, но не равно TransportModes.Plane значение которого равно 5.

Однако, если вы не используете степени двойки для значений перечисления флага, у вас, скорее всего, возникнут более серьезные проблемы.Подумайте о том, что произойдет, если Plane будет иметь значение 3: вы не можете отличить Bus | Train и Plane друг от друга ...

2 голосов
/ 23 сентября 2011

Если bus не является степенью двойки (если для него установлено несколько битов), а trip имеет только некоторые из этих установленных битов, (trip & bus) == bus будет ложным, но (trip & bus)) != 0 будет истинным.

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