Спецификация языка C# определяет производство грамматики пустого оператора, которое позволяет мне делать что-то вроде этого:
static void Main(string[] args)
{
; ; ;
}
Почему Microsoft включала бы это производство грамматики в язык C#? Это имеет полезную цель?
Я лично никогда не стал бы используйте пустой оператор. Если бы я по какой-то странной причине захотел поиграть в код-гольф и написать что-нибудь вроде
while(Foo(x++)) ;
, я бы предпочел использовать {} вместо; как "заявление ничего не делать". Я думаю, что это более понятно.
Во многом это связано с историческими причинами. Там нет ничего, что нельзя было бы сделать с {}.
ОБНОВЛЕНИЕ: Я только что подумал об одном возможном случае использования. В отладочной сборке он позволяет вам поставить точку останова где-нибудь, где вы гарантированно можете прерваться, и это не будет иметь никаких побочных эффектов при переходе. Если код, окружающий точку останова, особенно сложен, это может быть полезно.
ОБНОВЛЕНИЕ ОБНОВЛЕНИЕ: Я НЕПРАВИЛЬНО НЕПРАВИЛЬНО. Это не работает. Он просто перемещает точку останова на следующий оператор. Как утомительно.
Вот два использования:
while(DoSomething()) ;
и
void M() {
if(someCondition) goto exit;
// ...
exit: ;
}
Есть много других. Это полезное устройство в любое время, когда нечего делать, но требуется заявление.
C # во многом наследует от семейства C, где вы можете делать такие вещи, как
for (i = 0; i < n; v[i++] = 1);
или
while (testSomeCondition());
, то есть запускать цикл с пустым телом, где «мясо» заключено в скобки.
Хотя об их достоинствах и опасностях можно спорить, это довольно распространенные идиомы программирования в мире программирования C, поэтому такая обратная совместимость облегчает программистам на C / C ++ / Java изучение C #.
Это позволяет убрать блоки кода IFDEF, а окружающий код по-прежнему строить. например,
if(true){
#if(DEBUG)
System.Console.WriteLine("Debug comment");
#endif
}
, который можно записать как пустой блок, если вам не нравятся скобки:
if(true)
#if(DEBUG)
System.Console.WriteLine("Debug comment")
#endif
;
Хорошая практика или нет, но некоторые люди используют это:
while (!SomeCondition)
; // <-- body of the while loop is an empty statement
Зачем Microsoft включила эту грамматическую продукцию в язык C#?
основной ответ на этот вопрос: C# - это C-подобный язык, и чтобы облегчить жизнь различным разработчикам, MS решила сделать большинство основных элементов синтаксиса совместимыми с другими c-подобными языками. и это хорошо.
Если уж на то пошло, хорошее правило - заключается в том, что вы должны в отладчике каждую строку кода, которую вы пишете, по крайней мере, один раз для для каждого возможного пути выполнения
if (b1)
if (b2) else;
else
//code
без этого; это будет больно. но это тоже не лучший способ писать «если». но приемлемо.
Итак, какой-нибудь гений мог бы написать для (;;)
вместо , а (правда)
. Как на собеседовании.
Это предположение, но я предполагаю, что оно относится к базовой грамматике компилятора. Если говорить о теории множеств, то «пустой набор» находится внутри каждого отдельного набора. Это; на самом деле состоит в том, чтобы определить набор лексических операций, которые всегда должны определять; который также принимает базовый случай, который является пустым оператором.
Эрик Липперт хороший человек, чтобы спросить.
В основном, я полагаю, это потому, что это не причинит никакого вреда и упростит им работу с грамматикой. Кроме того, зачем ограничивать людей, когда это не нужно?