Подтвердить что ты не робот

Зачем использовать оператор | = в булевом значении в С#?

Пример:

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

bool tmp = false;

if (somecase)
   tmp = true;

if (someOtherCase)
   tmp |= true;   
4b9b3361

Ответ 1

Нет никакой веской причины. Булево значение |= true всегда будет true. Это кто-то пытается вообразить или забыть логическую логику =)

Измените его на tmp = true;.

Ответ 2

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

Скорее всего, они думали, что во втором случае они хотят сохранить результат оценки первого условия "если". Конечно, это ложное рассуждение.

Более простой эквивалентный оператор:

bool tmp = somecase | someOtherCase;

ИЗМЕНИТЬ

Как отмечает pickypg, это утверждение может сбивать с толку, так как большинство людей не ожидают | с булевыми значениями, и многие его не заметят, или не будут думать о последствиях для побочных эффектов. Лучший способ быть явным (если действительно есть побочные эффекты) - это решение minitech: просто измените значение |= на =.

Или, если побочных эффектов для выражения someOtherCase нет, используйте решение Jakub Konecki: someCase || someOtherCase.

Ответ 3

Интересно - похоже, что он делает эквивалент:

tmp = tmp | true;

который всегда устанавливает tmp в true.

Ответ 4

foo |= true - короткая версия foo = foo | true.

Фактический код можно переписать как

bool tmp = false;
tmp |= someCase;
tmp |= someOtherCase;

Или даже лучше, чем

someCase || someOtherCase

Ответ 5

Как и другие операторы op =, x |= y эквивалентен (кроме побочных эффектов с множественной оценкой) до x = x | y. Это сложный способ записи if (!x) x = y; или if (y) x = true;.

Однако, нет смысла иметь константу в правой части.

  • x |= true более просто записывается как x = true
  • x |= false оставляет x неизменным.

почему они это сделают.

Некоторые возможные объяснения:

  • Это опечатка: они хотели написать tmp = true; вместо tmp |= true;, но никогда не замечали этого, потому что их программа работала так, как ожидалось.
  • RHS первоначально была переменной, которая была заменена константой true без изменения кода.
  • tmp изначально был bitfield (для которого |= имеет больше смысла), который позже был сведен к одному биту.

Ответ 6

Конечным результатом будет "Если любой из случаев истинен, результат будет правдой". Нет никаких оснований полагать, что вам нужно использовать оператор, поскольку || в if будет работать так же хорошо.

Ответ 7

Умный компилятор мог бы избежать назначения в этом случае, хотя, вероятно, это не так, как если бы он не прерывал побитную операцию. В любом случае это похоже на микро-оптимизацию. На самом деле я подозреваю, что это шаблон удержания, который автор использует от битовых флагов (или он/она просто не понимает, как он работает). Было бы лучше:

bool tmp = somecase || someOthercase;

(а затем введите временное, если вы используете его только один раз)

Обратите внимание, что при использовании флагов это имеет смысл.

#define CONDITION_ONE 0x01
#define CONDITION_TWO 0x02

int temp = 0;
if (somecase) {
   temp = CONDITION_ONE;
}

if (someOthercase) {
   temp |= CONDITION_TWO;
}

Ответ 8

Это эквивалентно

tmp = tmp | true;

EDIT: Который равен

tmp = true;

Я согласен с остальными плакатами здесь...!

Дополнительная информация здесь

Ответ 9

Это выражение, использующее оператор | = присваивания. Проверьте MSDN

Ответ 10

для bools не так много

однако для бит-флагов это может сделать такой код:

int flags=0;
flags|=READ;
//flags|=UPDATE;
foo(arg,flags);

это позволяет легко комментировать некоторые флаги (и делает используемые флаги более читаемыми IMO)