И &&
, и ||
являются операторами «короткого замыкания», что означает, что если ответ известен из левого операнда, правый операнд не оценивается.
Это означает, что:
a && b
b
не будет оцениваться, если a
ложно, поскольку окончательный ответ уже известен.
Так же:
a || b
b
не будет оцениваться, если a
верно, поскольку окончательный ответ уже известен.
Если вы хотите вычислять оба операнда, используйте вместо них операторы &
и |
.
Преимущество этого заключается в том, что вы можете писать выражения, которые потерпят неудачу, если будут вычислены все операнды. Вот типичный оператор if:
if (a != null && a.SomeProperty != null && a.SomeProperty.Inner != null)
... use a.SomeProperty.Inner
Если бы a было нулевым, и выражение продолжило бы вычисление a.SomeProperty
, оно выдало бы NullReferenceException
, но поскольку &&
закорочено, если a
равно null
, выражение не будет оценивать остальные и, таким образом, не будет генерировать исключение.
Очевидно, что если вы замените &&
на &
, это исключение будет выдано, если a
или a.SomeProperty
равно null
.
person
Lasse V. Karlsen
schedule
19.12.2013