&& = в С#? (булево выражение)

Возможный дубликат:
Почему нет || = или & = операторов?

По чистой случайности я узнал сегодня, что

 a &= GetBool();

НЕ совпадает с

 a = a && GetBool();

Я, должно быть, неправильно понял это годами. В первом примере "GetBool()" выполняется, даже если "a" является ложным. Во втором случае это не так.

Есть ли что-нибудь для достижения чего-то вроде "& & =" в С#?

Ответ 1

Из документации:

Выражение, использующее оператор присваивания & =, например

x & = y

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

x = x и y

за исключением того, что x оценивается только один раз. Оператор и оператор выполняет побитовой логической операции И на интегральных операндах и логических И на bool операнды.

Я бы сказал, чтобы избежать оценки y, когда это не необходимо, используйте

x = x && y

и избегать оценки x дважды (независимо от того, что это означает), используйте

x &= y

Вы не можете комбинировать оба.

Микро-оптимизированный (по крайней мере, для теоретического случая):

if (x) x = y;

Вам не нужно ничего делать, если x уже false.

Ответ 2

Есть ли что-нибудь для достижения чего-то вроде "& & =" в С#?

Ну, вы можете написать

a = a && getBool();

вместо этого... Я не могу думать о многих ситуациях, когда я действительно хотел бы сделать что-то другое, если честно. Даже выше это довольно редко, IME.

Не существует составного оператора присваивания для &&, || или ?? (которые являются очевидными операторами короткого замыкания). См. Раздел 7.17 спецификации С# 4 для полного списка операторов составных присвоений и раздел 7.17.2 для получения более подробной информации о том, что именно делает составное присвоение.