Что означает двоеточие после условного блока в 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 будет компилировать как допустимый синтаксис для пустой инструкции, так как это просто завершение инструкции. Ваш код будет компилироваться и дополнительно ; не будет проблемой.

Он может быть удален для очистки кода, если вы хотите, но оставить его в не вызовет каких-либо негативных последствий.

надеюсь, что это помогает.