Что означает двоеточие после условного блока в C#?
недавно я наткнулся на этот код в проекте , который, как я предполагаю, был там по ошибке:
if(condition)
{
//Whatever...
};
обратите внимание на точку с запятой после закрывающей скобки.
кто-нибудь знает какой эффект от этого?
Я предполагаю, что это не имеет никакого эффекта, но подумал бы, что это вызвало бы ошибку компилятора.
3 ответов
это простой вопрос с простым ответом, но я просто хотел добавить что-то важное. Часто люди понимают, что это ничего и особенно для случая, который вы представили, двоеточие является ненужным завершением строки.
но каково обоснование этого ?
на самом деле, эти пустые утверждения разрешены для таких утверждений:
// Use an empty statement as the body of the while-loop.
while (Method())
;
Я согласен, что он ничего не делает. Но это может помогите определенным циклам соответствовать синтаксическим требованиям языка, и я думаю, что это то, что люди должны понимать из него. Как уже говорилось, Я согласен, что вы можете удалить его, я просто хотел подчеркнуть, почему c# позволяет это.
дополнительно разъяснить
пустой оператор используется, когда вам не нужно выполнять операцию, где требуется оператор. Он просто передает управление в конечную точку оператора. Она не имеет никакого эффекта, она чиста. синтаксический сахар.
как указано @PaulF, в приведенном выше примере вы мог бы используйте пустой блок ({}
) вместо. Это было бы совершенно справедливо и имело бы тот же эффект.
опять же, все сводится к стилю. Вам это не нужно, но это, безусловно, может помочь вам соответствовать любым правилам вашей среды кодирования.
общие случаи использования (где можно было видеть пустой заявления)
-
в то время как цикл с пустым телом (тот же случай, который я подчеркнул выше)
void ProcessMessages() { while (ProcessMessage()) ; // Statement needed here. }
-
goto
заявления (редко используется, но все еще действует)void F() { //... if (done) goto exit; //... exit: ; // Statement needed here. }
С MSDN
-
декларации класс (реквизит для @EricLippert для приведения этого)
class SomeClass { ... };
обратите внимание, что в этом случае, как заявил @EricLippert в разделе "Комментарии"это просто любезность для программистов на C++, которые привыкли печатать полупустоты после классов; C++ требует этого.
хотя общее использование пустых утверждений спорно в основном из-за путаницы, которую они могут принести, на мой взгляд, синтаксически говоря, они имеют место в C#. Мы не должны забывать, что C# - это инкремент C++ (который в основном объясняет #
ака. четыре символа " + " в формате два на два grid) и по историческим причинам разрешение пустых заявлений облегчало переход.
это, похоже, не имеет никакого эффекта, хотя я бы не рекомендовал писать код таким образом.
в случае, если вы когда-либо хотите добавить else
или else if
после ;
, он не будет компилироваться.
Ex:
if(5>1) {
//whatever
}; else {
//whatever
}
это не будет компилироваться (обратите внимание на ;
до else
)
Это то, что Visual Studio будет компилировать как допустимый синтаксис для пустой инструкции, так как это просто завершение инструкции. Ваш код будет компилироваться и дополнительно ;
не будет проблемой.
Он может быть удален для очистки кода, если вы хотите, но оставить его в не вызовет каких-либо негативных последствий.
надеюсь, что это помогает.