Подтвердить что ты не робот

Является ли использование && короткого замыкания безопасным в .NET?

Предположим, что myObj равно null. Можно ли написать это?

if(myObj != null && myObj.SomeString != null)

Я знаю, что некоторые языки не будут выполнять второе выражение, потому что && оценивает значение false до выполнения второй части.

4b9b3361

Ответ 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 Пользовательские условно-логические операторы)

Ответ 2

Да, С# использует логическое короткое замыкание.

Обратите внимание, что хотя С# (и некоторые другие языки .NET) ведут себя таким образом, это свойство языка, а не CLR.

Ответ 3

Ваш код в безопасности - && и || оба короткозамкнуты. Вы можете использовать некороткозамкнутые операторы и /, которые оценивают оба конца, но я действительно не вижу этого в большом производственном коде.

Ответ 5

уверен, что он безопасен на С#, если первый операнд является ложным, а второй никогда не оценивается.

Ответ 6

пример

if(strString != null && strString.Length > 0)

Эта строка вызовет нулевое исключение, если обе стороны выполнены.

Интересная заметка. Вышеприведенный пример довольно немного быстрее, чем метод IsNullorEmpty.

Ответ 7

Это абсолютно безопасно. С# является одним из этих языков.

Ответ 8

Да, С# и большинство языков вычисляют предложения if слева направо.

VB6, кстати, вычислит все это и выбросит исключение, если оно будет null...

Ответ 9

В С#, && и || закорочены, что означает, что первое условие оценивается, а остальные игнорируются, если ответ определен.

В VB.NET AndAlso и OrElse также закорочены.

В javaScript, && и || также закорочены.

Я упоминаю VB.NET, чтобы показать, что уродливый рыжеволосый step-child.net также иногда имеет классный материал.

Я упоминаю javaScript, потому что, если вы занимаетесь веб-разработкой, вы, вероятно, также можете использовать javaScript.