Есть ли разница в двух, если заявления в C # - PullRequest
2 голосов
/ 04 февраля 2012

есть ли разница между:

 if (myObject != null && myObject.someint == 0)
 {
      // do something
 }

и

if (myObject != null)
{
    if (myObject.someint == 0)
    {
        // do something
    }
}

Я всегда думал, что он оценивает первое условие, и если ложно, он пропускает оценку второго. Однако я получил ошибку во время выполнения нулевой ссылки. myObject был нулевым, и он пытался проверить myObject.someint

Объект может быть изменен извне, это тот случай, когда он проверял первое условие существования объекта, но когда он перешел к следующему условию, что-то уничтожило ссылку в myObject?

если это последнее, то любого способа избежать (на мой взгляд, оба вышеуказанных способа выполнения проверки if одинаковы). Единственное, что я могу себе представить, это try/catch

Ответы [ 3 ]

6 голосов
/ 04 февраля 2012

Это должно быть более позднее условие, так как && короткое замыкание на false. Используйте

lock(myObject)
3 голосов
/ 04 февраля 2012

C# использует оценку короткого замыкания, поэтому они эквивалентны.

Оператор условного И (&&) выполняет логическое И своих операндов bool, но оценивает только свой второй операндесли необходимо. Ref .

Но, как указывает @pst, это может быть проблема с многопоточностью.

0 голосов
/ 04 февраля 2012

Первый проверит 2 условия и может вызвать исключение во втором условии myObject.someint = 0, если первое условие было Null ..

Второй сначала проверит, не является ли объект Null, затем перейдет к следующей проверке, в противном случае он не будет продолжен. в этом случае не будет выброшено исключение ..

так что в принципе я бы выбрал второй. он не выдаст исключение, и мне не нужно использовать try/catch штуковину ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...