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

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

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

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

12 ответов


while (GetWhitespace(textStream))
    ;

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

while(Foo(x++)) ;

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

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

UPDATE: я просто подумал об одном возможном случае использования. В отладочной сборке он позволяет поместить точка останова где-то, что вам гарантировано, что вы можете сломать, в котором не будет никакого побочного эффекта при шаге. Если код, окружающий точку останова, особенно сложен, это может быть полезно.

UPDATE UPDATE: я ошибаюсь, ошибаюсь. Это не работает. Он просто перемещает точку останова в следующий оператор. Как досадно.


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

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'D вне, и окружающий код все еще строит. например!--3-->

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

withoud этого ; это будет больно. но это не лучший способ написать "если". но приемлемо.


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

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


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

ref:возможно ошибочное пустое утверждение


чтобы какой-нибудь гений мог написать for(;;) вместо while(true). Как для теста на собеседование.