Ответ 1
Да. В С# &&
и ||
закорочены и, следовательно, оценивают правую сторону, только если левая сторона еще не определяет результат. Операторы &
и |
, с другой стороны, не замыкаются и всегда оценивают обе стороны.
Спектр говорит:
Операторы
&&
и||
называются условными логическими операторами. Их также называют логическими операторами "короткого замыкания".
...
Операцияx && y
соответствует операцииx & y
, за исключением того, чтоy
оценивается, только еслиx
-true
...
Операцияx && y
оценивается как(bool)x ? (bool)y : false
. Другими словами,x
сначала оценивается и преобразуется в типbool
. Затем, еслиx
true
,y
оценивается и преобразуется в типbool
, и это становится результатом операции. В противном случае результатом операции будетfalse
.
(Спецификация языка С# Версия 4.0 - 7.12 Условные логические операторы)
Одним интересным свойством &&
и ||
является то, что они замыкаются, даже если они не работают на bools, а типы, в которых пользователь перегружал операторы &
или |
вместе с true
и false
.
Операция
x && y
оценивается какT.false((T)x) ? (T)x : T.&((T)x, y)
, гдеT.false((T)x)
является вызовомoperator false
, объявленным вT
, аT.&((T)x
, y) является вызовом выбранногоoperator &
. Кроме того, значение (T) x оценивается только один раз.Другими словами,
x
сначала оценивается и преобразуется в типT
, аoperator false
вызывается в результате, чтобы определить, является лиx
определенноfalse
.
Тогда, еслиx
определенноfalse
, результатом операции является значение, ранее вычисленное дляx
, преобразованное в типT
.
В противном случае оцениваетсяy
, и выбранный оператор&
вызывается на значение, ранее вычисленное дляx
, преобразованное в типT
, и значение, вычисленное дляy
, чтобы получить результат операции.
(С# Language Specification Version 4.0 - 7.12.2 Пользовательские условно-логические операторы)