2013-05-23 3 views
11

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

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

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

Раньше я использовал подход 1, и он хорошо работает. Ищите ссылку MSDN, в которой говорится об использовании.

UPDATE

"short-circuit" evaluation См

КОД

List<string> employees = null; 

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

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

поиск "короткое замыкание"! – David

ответ

31

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

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

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

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

+5

@ Lijo Googling ["msdn short-circuit"] (https://www.google.com/search?q=msdn+short-circuit), первые два результата - [это] (http://msdn.microsoft. com/en-us/library/2a723cdk (v = vs.71) .aspx) и [this] (http://msdn.microsoft.com/en-us/library/6373h346 (v = vs.71) .aspx). Достаточны ли они? – Dukeling

8

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

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

2

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

5

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

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

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

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

· Определенное присваивание состояния V, прежде чем expr-first такого же, как определенное присваивания состояния V перед ехргом.

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

· Определенное присваивание состояние V после ехрг определяется:

о Если состояние V после expr-first является определенно присвоенной, то состояние V после ехрг будет вполне определенной.

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

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

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

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

Итак, становится ясно, что выраж-первых всегда вычисляется и, если оно истинно тогда и только тогда, выраж-вторых также оценивается.

2

слева направо, в то время как выражение по-прежнему вызывает сомнения.

0

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

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

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, потому что оба условия были оценены.

2

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

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

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

Смежные вопросы