Как работает оператор присваивания или (|=)? (С#)

Я видел документацию и ответы (1) (2), которые пытаются объяснить, что такое оператор |= и как он работает, и хотя на базовом уровне это имеет смысл... Я не совсем понимаю, почему и как он выполняет то, что делает.

В пояснениях говорится, что a |= b эквивалентно a = a | b, но я не понимаю, как он оценивает, дать ли a значение самого себя (a) или значение b. Насколько я понимаю, "или" означает, что может быть одно из двух, но не указывает, какое именно.

В Visual Studio я использую расширение под названием Refactoring Essentials, которое предлагает заменить часть моего кода строкой с оператором |=, и хотя код работает с оператором, я не понимаю, как он это делает. , что побудило меня попытаться изучить его в Интернете (и, как следствие, задать этот вопрос).

Мой код пошел от

if (MessageBox.Show("Are you sure you want to cancel this operation?", "Confirm Cancel", MessageBoxButton.YesNo, MessageBoxImage.Exclamation, MessageBoxResult.No) == MessageBoxResult.No)
{
    e.Cancel = true;
}

to

e.Cancel |= MessageBox.Show("Are you sure you want to cancel this operation?", "Confirm Cancel", MessageBoxButton.YesNo, MessageBoxImage.Exclamation, MessageBoxResult.No) == MessageBoxResult.No;

и это все еще работало. Хотя я предполагаю, что e.Cancel определяется на основе оценки MessageBox.Show(...) == MessageBoxResult.No, я не знаю, зачем там нужен оператор |=. Почему бы просто не использовать стандартный оператор присваивания (=), поскольку результатом выражения является логическое значение, а e.Cancel принимает логическое значение? А как насчет использования условного оператора (?:)? Как |= соотносится с этим (если вообще имеет)?


person JaykeBird    schedule 26.04.2016    source источник
comment
Потому что это альтернатива. Если вещь уже отменена (отмена имеет истинное значение перед отображением MessageBox), то ответ MessageBox не важен. Однако мне не нравятся такие результаты рефакторинга, потому что их становится очень трудно читать и понимать. :P Это выглядит ненужным излишеством.   -  person mikes    schedule 26.04.2016
comment
@mikes Ответ, который я принял, помог мне понять, что такое оператор. Хотя насчет рефакторинга согласен. Учитывая, как я некоторое время был озадачен и этим, возможно, это был рефакторинг, который мне лучше не делать, лол. Расширение предоставляет мне и другие варианты рефакторинга, которые я бы никогда не реализовал в своем коде, потому что это ухудшает читабельность кода.   -  person JaykeBird    schedule 26.04.2016


Ответы (1)


| — это оператор БИТОВОГО ИЛИ, а не логический оператор ИЛИ.

Предположим, у вас есть два 8-битных двоичных числа 10110100 и 11000101.

Если вы выполните побитовое ИЛИ, вы получите 1 бит, установленный на выходе для каждой позиции, где бит установлен в первом ИЛИ втором входе, и 0 бит, где НИ ОДИН из двух входных битов не установлен:

10110100 
11000101
--------
11110101

Вот и все.

Как вы уже знаете, x |= y; точно такое же, как x = x | y;.

Последнее, что следует отметить, это то, что bool обрабатывается так, как если бы это было однобитовое число, где 1 = истина и 0 = ложь, для целей побитовых операций | и & при применении к bool.

Однако обратите внимание, что вы не можете смешивать побитовые операции bool и int. Например, следующее приведет к ошибке компиляции:

bool t = true;
bool f = false;
int x = t | f; // Error: Cannot implicitly convert type 'bool' to 'int'

ДОПОЛНЕНИЕ:

Причина, по которой люди используют &= и |= вместо bool, а не более логичных (каламбур) &&= и ||=, заключается в том, что последних двух операторов на самом деле не существует!

person Matthew Watson    schedule 26.04.2016
comment
Итак, в контексте моего кода: если MessageBox.Show(...) == ... истинно, а e.Cancel ложно, результат все равно верен. И то же самое, если значения меняются местами (если e.Cancel истинно, а MessageBox... ложно). И если ни e.Cancel, ни MessageBox... не являются правдой, то тогда для него устанавливается значение false. Хорошо... теперь, когда меня подтолкнули, я думаю, что начинаю понимать. Извините, если мой вопрос показался немного глупым, я просто никогда не делал такого вывода. Я, честно говоря, забыл, что существует побитовый оператор ИЛИ. Спасибо вам за помощь! - person JaykeBird; 26.04.2016