2012-02-09 2 views
0

Пример кода:Пояснение для одной строки, если поведение оператора?

int hour = 0; 
bool saveData = true; 

if(hour > 0) doSomeMethod(); saveData = false; 

В приведенном выше коде, SaveData всегда будет установлено значение ложно, пока doSomeMethod() не будет запущено. Я понял, что компилятор обрабатывает полуколону после doSomeMethod() в качестве индикатора для перехода к следующему утверждению, игнорируя, что он находится в той же строке, что и оператор if. В чем причина такого поведения?

+1

Вот почему всегда лучше обернуть инструкцию if в блоках кода {} – MethodMan

ответ

6

Оператор if может содержать либо один оператор, либо блок кода. Как только компилятор находит ;, он заканчивает if.

Ваш код выше эквивалентен:

if (hour > 0) 
    doSomeMethod(); 
saveData = false; 

Что вы хотите:

if (hour > 0) 
{ 
    doSomeMethod(); 
    saveData = false; 
} 

или:

if (hour > 0) { doSomeMethod(); saveData = false; } 
+0

Это был ответ, который я ищу, другими словами: оператор if может содержать либо инструкцию SINGLE, либо блок кода. –

+5

@ Mr.Smith: Нет, оператор «if» может содержать * один оператор *, период. ** Кодовый блок * - это один оператор. ** (Обратите внимание, что один оператор не может быть помеченным инструкцией или локальным заявлением). –

4

C# игнорирует символы новой строки, так же, как C и других его потомков , и использует ; для разделения заявлений. Ваш код полностью эквивалентен

int hour = 0; 
bool saveData = true; 

if(hour > 0) 
    doSomeMethod(); 
saveData = false; 

, который лучше стиль, кстати.

1

В C#, если заявление может быть:

if(expression) statement; 

или

if(expression) { statement1; ... statementN; } 

Вы отсутствие Кодекса брекетов делает это первое, таким образом, ваше предположение верно.