Что делает полуколока после условного блока в С#?

Я недавно наткнулся на этот код в проекте, который, я полагаю, был там по ошибке:

if(condition)
{
   //Whatever...
};

Обратите внимание на запятую после закрытия.

Кто-нибудь знает, каков эффект этого?

Я предполагаю, что это не имеет никакого эффекта, но подумал бы, что это вызвало ошибку компилятора.

Ответ 1

Это простой вопрос с простым ответом, но я просто хотел добавить что-то важное. Часто люди понимают, что он ничего не делает, и особенно для случая, который вы представили, полу-двоеточие - это ненужное прерывание строки.

Но в чем причина этого?

На самом деле, эти пустые утверждения разрешены для оператора:

 // Use an empty statement as the body of the while-loop.
while (Method())
        ;

Я согласен, что ничего не делает. Но это может помочь определенным циклам соответствовать синтаксическим требованиям языка, и я думаю, что это то, что люди должны понимать из него. Как сказал другой, я согласен, что вы можете удалить его, я просто хотел подчеркнуть, почему С# позволяет это.

Дальнейшее уточнение

Пустой оператор используется, когда вам не нужно выполнять операцию, в которой требуется инструкция. Он просто передает управление конечной точке инструкции. Это не имеет никакого эффекта, это чистый синтаксический сахар.

Как указано в @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++, которые используются для ввода semis после классов; C++ требует этого.

Хотя общее использование пустых утверждений дискутируется главным образом из-за путаницы, которую они могут принести, на мой взгляд, синтаксически говоря, у них есть место на С#. Мы не должны забывать, что С# является приращением C++ (который в основном объясняет # aka. Четыре символа "+" в сетке "два на два") и по историческим причинам, позволяя пустым операторам облегчать переход.

Ответ 2

Это, похоже, не имеет никакого эффекта, хотя я бы не рекомендовал писать код таким образом.

В случае, если вы когда-либо захотите добавить else или else if после ; , он не будет компилироваться.

Пример:

if(5>1) {
  //whatever
}; else {
  //whatever
}

Это не будет компилировать (обратите внимание ; прежде, чем else)

Ответ 3

Это то, что Visual Studio будет компилировать как допустимый синтаксис для пустого оператора, поскольку это просто завершение оператора. Ваш код будет компилироваться, а дополнительный ; не будет проблемой.

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

Надеюсь это поможет.