Объяснение для одной строки, если поведение оператора?

Пример кода:

int hour = 0;
bool saveData = true;

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

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

3 ответа

Решение

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

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

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

То, что вы хотите, это:

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

или же:

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

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

int hour = 0;
bool saveData = true;

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

кстати, лучший стиль.

В C# оператор if может быть:

if(expression) statement;

или же

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

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

Другие вопросы по тегам