Пустой Оператор C#
на спецификация языка C# определяет пустой-заявлением производство грамматики, которое позволяет мне делать что-то вроде этого:
static void Main(string[] args)
{
; ; ;
}
почему Microsoft включает эту грамматику в язык C#? Имеет ли это полезную цель?
12 ответов
Я лично никогда не использовал бы пустой оператор. Если бы я по какой-то странной причине хотел играть в гольф и писать что-то вроде
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 этого ; это будет больно. но это не лучший способ написать "если". но приемлемо.
Эрик Липпертхороший человек, чтобы спросить.
в основном, я полагаю, это потому, что это не причинит никакого вреда, и это упростило их обработку грамматики. Кроме того, зачем ограничивать людей, когда вам это не нужно?
для чего это стоит, хорошее правило большой палец - это то, что вы должны были шагнуть через отладчик каждую строку кода Вы пишете, по крайней мере один раз для каждый возможный путь выполнения