Пустой оператор C#

Спецификация языка C# определяет производство грамматики пустого оператора, которое позволяет мне делать что-то вроде этого:

static void Main(string[] args)
{
    ; ; ;
}

Почему Microsoft включала бы это производство грамматики в язык C#? Это имеет полезную цель?

10
задан James Jones 3 March 2010 в 20:12
поделиться

12 ответов

while (GetWhitespace(textStream))
    ;
14
ответ дан 3 December 2019 в 14:00
поделиться

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

while(Foo(x++)) ;

, я бы предпочел использовать {} вместо; как "заявление ничего не делать". Я думаю, что это более понятно.

Во многом это связано с историческими причинами. Там нет ничего, что нельзя было бы сделать с {}.

ОБНОВЛЕНИЕ: Я только что подумал об одном возможном случае использования. В отладочной сборке он позволяет вам поставить точку останова где-нибудь, где вы гарантированно можете прерваться, и это не будет иметь никаких побочных эффектов при переходе. Если код, окружающий точку останова, особенно сложен, это может быть полезно.

ОБНОВЛЕНИЕ ОБНОВЛЕНИЕ: Я НЕПРАВИЛЬНО НЕПРАВИЛЬНО. Это не работает. Он просто перемещает точку останова на следующий оператор. Как утомительно.

11
ответ дан 3 December 2019 в 14:00
поделиться

Вот два использования:

while(DoSomething()) ;

и

void M() {
    if(someCondition) goto exit;
    // ...
    exit: ;
}

Есть много других. Это полезное устройство в любое время, когда нечего делать, но требуется заявление.

5
ответ дан 3 December 2019 в 14:00
поделиться

C # во многом наследует от семейства C, где вы можете делать такие вещи, как

for (i = 0; i < n; v[i++] = 1);

или

while (testSomeCondition());

, то есть запускать цикл с пустым телом, где «мясо» заключено в скобки.

Хотя об их достоинствах и опасностях можно спорить, это довольно распространенные идиомы программирования в мире программирования C, поэтому такая обратная совместимость облегчает программистам на C / C ++ / Java изучение C #.

3
ответ дан 3 December 2019 в 14:00
поделиться

Это позволяет убрать блоки кода IFDEF, а окружающий код по-прежнему строить. например,

if(true){
#if(DEBUG)
System.Console.WriteLine("Debug comment");
#endif
}

, который можно записать как пустой блок, если вам не нравятся скобки:

if(true)
#if(DEBUG)
   System.Console.WriteLine("Debug comment")
#endif
;
2
ответ дан 3 December 2019 в 14:00
поделиться

Хорошая практика или нет, но некоторые люди используют это:

while (!SomeCondition)
    ; // <-- body of the while loop is an empty statement
1
ответ дан 3 December 2019 в 14:00
поделиться

Зачем Microsoft включила эту грамматическую продукцию в язык C#?

основной ответ на этот вопрос: C# - это C-подобный язык, и чтобы облегчить жизнь различным разработчикам, MS решила сделать большинство основных элементов синтаксиса совместимыми с другими c-подобными языками. и это хорошо.

1
ответ дан 3 December 2019 в 14:00
поделиться

Если уж на то пошло, хорошее правило - заключается в том, что вы должны в отладчике каждую строку кода, которую вы пишете, по крайней мере, один раз для для каждого возможного пути выполнения

ссылка: Возможный ошибочный пустой оператор

0
ответ дан 3 December 2019 в 14:00
поделиться
if (b1)
   if (b2) else;
else
   //code

без этого; это будет больно. но это тоже не лучший способ писать «если». но приемлемо.

0
ответ дан 3 December 2019 в 14:00
поделиться

Итак, какой-нибудь гений мог бы написать для (;;) вместо , а (правда) . Как на собеседовании.

0
ответ дан 3 December 2019 в 14:00
поделиться

Это предположение, но я предполагаю, что оно относится к базовой грамматике компилятора. Если говорить о теории множеств, то «пустой набор» находится внутри каждого отдельного набора. Это; на самом деле состоит в том, чтобы определить набор лексических операций, которые всегда должны определять; который также принимает базовый случай, который является пустым оператором.

1
ответ дан 3 December 2019 в 14:00
поделиться

Эрик Липперт хороший человек, чтобы спросить.

В основном, я полагаю, это потому, что это не причинит никакого вреда и упростит им работу с грамматикой. Кроме того, зачем ограничивать людей, когда это не нужно?

0
ответ дан 3 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: