Порядок выполнения условий в C # If

c# .net conditional logical-operators short-circuiting

22331 просмотра

8 ответа

Ниже приведены два оператора if, которые имеют несколько условий с использованием логических операторов. Логически оба одинаковы, но порядок проверки отличается. Первый работает, а второй не работает.

Я передал MSDN для проверки того, определен ли порядок выполнения условий; но я не смог найти.

Рассмотрим условие множественной проверки, которое имеет &&логический оператор. Гарантируется ли, что он всегда будет проверять первое условие, а если оно не выполнено, второе условие не будет проверено?

Я использовал подход 1, и он работает хорошо. Ищите ссылку на MSDN, подтверждающую использование.

ОБНОВИТЬ

См. Оценку «короткого замыкания»

КОД

  List<string> employees = null;  

  if (employees != null && employees.Count > 0)
  {
        string theEmployee = employees[0];
  }

  if (employees.Count > 0 && employees != null)
  {
        string theEmployee = employees[0];
  }
Автор: LCJ Источник Размещён: 13.11.2019 11:41

Ответы (8)


50 плюса

Решение

&& и || операторы короткого замыкания. Это:

1) Если && оценивает свой первый операнд как ложный, он не оценивает свой второй операнд.

2) Если || оценивает свой первый операнд как истинный, он не оценивает свой второй операнд.

Это позволяет вам делать проверку на нуль && делать что-то с объектом, как если бы он не был нулевым, второй операнд не оценивается.

Автор: Patashu Размещён: 23.05.2013 10:07

10 плюса

Вы должны использовать:

  if (employees != null && employees.Count > 0)
  {
        string theEmployee = employees[0];
  }

&&будет employees.Countкоротким замыканием и не будет выполнено, если employeesесть null.

В вашем втором примере приложение будет сгенерировано исключение , если employeesэто nullкогда вы пытаетесь Countэлементы в коллекции.

http://msdn.microsoft.com/en-us/library/2a723cdk(v=vs.71).aspx

Автор: Darren Размещён: 23.05.2013 10:07

8 плюса

Условия проверяются слева направо. &&Оператор будет оценивать только правильное состояние , если левое условие истинно.

Раздел 5.3.3.24 Спецификации языка C # гласит:

5.3.3.24 && выражения

Для выражения expr формы expr-first && expr-second:

● Состояние определенного присваивания переменной v перед expr-firstаналогично состоянию определенного присваивания переменной v перед выражением.

· Определенное состояние присваивания v before expr-secondопределенно присваивается, если состояние v after expr-firstлибо определенно назначено, либо «определенно назначено после истинного выражения». В противном случае он не определен.

· Состояние определенного присваивания переменной v после выражения expr определяется:

o Если состояние v после expr-firstопределенно назначено, то состояние v после expr определенно назначено.

o В противном случае, если состояние v after expr-secondопределенно назначено, а состояние v after expr-first«определенно назначено после ложного выражения», то состояние v после expr определенно назначается.

o В противном случае, если состояние v после expr-secondопределенно назначено или «определенно назначено после истинного выражения», то состояние v после expr «определенно назначено после истинного выражения».

o В противном случае, если состояние v after expr-first«определенно назначено после ложного выражения», а состояние v after expr-second«определенно назначено после ложного выражения», то состояние v после expr «определенно назначается после ложного выражения».

o В противном случае состояние v после expr определенно не назначается.

Таким образом, это дает понять, что expr-first всегда вычисляется, и если true, то и только тогда expr-second также оценивается.

Автор: John Willemse Размещён: 23.05.2013 10:08

3 плюса

слева направо, в то время как выражение все еще сомнительно.

Автор: G.Y Размещён: 23.05.2013 10:20

2 плюса

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

Автор: Frank Rem Размещён: 23.05.2013 10:07

2 плюса

&& и || операторы часто используются для проверки состояния объекта.

1) Условие «&&» оценивает свой первый операнд как ложное, оно не оценивает свой второй операнд. Если он возвращает true, второе условие оценивается. Если второе условие истинно, то только оно вернет истину. Таким образом, && можно использовать, чтобы убедиться, что все условия выполняются как действительные.

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

Автор: Chirag Размещён: 18.03.2014 10:32

0 плюса

Гарантируется ли, что он всегда будет проверять первое условие, а если оно не выполнено, второе условие не будет проверено?

Короткий ответ - да.

Автор: yclkvnc Размещён: 23.05.2013 10:38

0 плюса

См., Например, эту страницу MSDN для &&, которая описывает оценку короткого замыкания.

Вы можете проверить или доказать последовательность выполнения следующим образом:

int i;
bool b;
b=((i=3)==0 && (i=4)!=0);
Console.WriteLine(i);
b=((i=3)!=0 || (i=4)!=0);
Console.WriteLine(i);

Вы получаете 3 в обоих случаях - это показывает, что в обоих случаях происходит короткое замыкание. С другой стороны, вы могли бы использовать '&' или '|', соответственно, логический оператор, чтобы предотвратить это. Таким образом, вы получите результат 4, потому что оба условия были оценены.

Автор: JeffRSon Размещён: 23.05.2013 10:49
32x32