Вопрос

Я часто делаю это, когда это необходимо для предотвращения исключение нулевого указателя:

// Example #1
if (cats != null && cats.Count > 0)
{
  // Do something
}

В # 1, я всегда предполагал, что cats != null должен быть первым, потому что порядок операций оценивается слева направо.

Однако, В отличие от пример # 1, теперь я хочу сделать что-то, если объект null или если то Count это равно нулю, поэтому я использую логическое или вместо и:

// Example #2
if (table == null || table.Rows == null || table.Rows.Count <= 0)
{
  // Do something
}

Делает приказ о логических сравнениях материи? Или я могу также отменить заказ и получить те же результаты, например, в примере № 3?

// Example #3
if (table.Rows.Count <= 0 || table.Rows == null || table == null)
{
  // Do something
}

(Кстати, я понимаю, что могу переписать # 2, как внизу, но я думаю, что это грязно, и мне все еще интересно или операторы)

// Example #4
if (!(table != null && table.Rows != null && table.Rows.Count > 0))
{
  // Do something
}
Это было полезно?

Решение

Да, короткое замыкание происходит в обоих случаях, единственная разница в том, что он останавливается, если LHS является ложным (потому что общее выражение должно быть ложным), пока || останавливается, если LHS верно (потому что общее выражение должно быть правдой).

Первые два примера в вашем вопросе верны, третий бросит исключение, если таблица или таблица.

Другие советы

В примере вы предоставляете:

if (table == null || table.Rows == null || table.Rows.Count <= 0)
{
  // Do something
}

...ни один table.Rows, ни table.Rows.Count, будет разветвляться, если tables нулевой.

Это потому, что, с C # логическими операторами, порядок операций. C # Логические операторы короткое замыкание - Они оценивают слева направо, и если какой-либо результат приводит к тому, что остальная часть выражения будет содействительным, остальная часть выражения не будет оценена.

Рассмотрим этот код:

bool A()
{
    return false;
}

bool B()
{
    return true;
}

//...

if (A() && B())
{
    // do something
}

Для того, чтобы быть правдой, все элементы должны быть правдой. Однако, A() Возвращает false, и время выполнения (или, возможно, компилятор здесь, на шаге оптимизации, но давайте не будем беспокоиться о том, что ...) не оценит B() вообще.

То же самое относится и верно для или (||) выражения. Если какой-либо элемент в пункте является верным, оценивается влево направо, остальная часть предложения не будет выполнена.

Следует отметить, что не все логические операторы C #, демонстрируют краткосмысленное поведение (как было указано выше).

Вы используете условный и оператор (&&), и это делает короткое замыкание. Однако оператор A и (&) точно такой же, как условный - и без короткого замыкания.

То же самое верно для или и условными или операторами.

Например:

// Это бросит, если кошки нулевые, какой бы заказ.

Если (кошки! = null & cats.count> 0) {}

// Это не будет. Из-за короткого приручения.

если (кошки! = null && cats.count> 0) {}

Первая конструкция не такой, как второй. Первый - использовать, когда вы хотите ничего сделать, когда ссылка на нуле или счет, равна нулю. Второе строительство будет ДЕЛАТЬ что-то, когда он нулевой или счет, равен нулю ... сделать второй так же, как и первым, что вам нужно будет написать:

 if (table == null || table.Rows == null || table.Rows.Count <= 0 || ) 
 {}
 else
 { 
  // Do something 
 } 

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

Заказать вопросы. Все о коротких замыкании. Для Ands, первая ложь, которое он попадает, он перестает оценивать, для или останавливается, как только оно попадает на правду.

Это будет короткое замыкание после первой эволяции, и поэтому вы не получаете исключение NULL указателя.

Когда вы думаете об этом, подумайте, вставить нуль для каждого объекта.

if (null== null || null.Rows == null || null.null.Count <= 0)
{
  // Do something
}

Затем оцените каждый логический

if( true || null.Rows == null || null.null.Count <=0)

Если вы видите, что это означает, что останавливается. Если вы попали в «нулевой». Заявление вы будете крах.

Пример, чтобы проиллюстрировать сбой

if (null.null.Count <= 0 || null.Rows == null || null== null)
{
  // CRASH... Do something
}

Приказ не имеет значения.

Разъяснение:

Заказ, который вы размещаете заявления в заявлении IF, не повлияют на то, в случае или нет ли его заявление в ... и, следовательно, результат.

Как указал другой плакат, это, однако, повлияет на то, какие из них оцениваются, но это не влияет на нижнюю строку AFAIK.

Редактировать @jonhanna

Я думаю, я посмотрел на это с точки зрения того, что OP заявил, что он проверяет на наличие NPE до при необходимости (см. Первую строку своего поста). Так что, если его код не производит ошибки времени выполнения, то заказать ничего не значит. Я не могу себе представить, почему кто-то будет кодировать, если заявление, если с мыслительным процессом «Если это, если заявление вызывает NPE», то он не оценивается ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top