Да.В C # &&
и ||
имеют короткое замыкание и, таким образом, оценивают правую сторону только в том случае, если левая сторона еще не определяет результат.Операторы &
и |
, с другой стороны, не закорачивают и всегда оценивают обе стороны.
В спецификации сказано:
&&
и ||
операторы называются условными логическими операторами.Их также называют «короткозамкнутыми» логическими операторами.
...
Операция x && y
соответствует операции x & y
, за исключением того, что y
оценивается, только если x
равно true
...
Операция x && y
оценивается как (bool)x ? (bool)y : false
.Другими словами, x
сначала оценивается и преобразуется в тип bool
.Затем, если x
равно true
, y
вычисляется и преобразуется в тип bool
, и это становится результатом операции.В противном случае результат операции будет false
.
(Спецификация языка C # версия 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
, для получения результата операции.
(Спецификация языка C # версия 4.0 - 7.12.2 Пользовательские условные логические операторы)