&& = в С#? (булево выражение)
Возможный дубликат:
Почему нет || = или & = операторов?
По чистой случайности я узнал сегодня, что
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 для получения более подробной информации о том, что именно делает составное присвоение.