C # Пустое заявление - PullRequest
       25

C # Пустое заявление

10 голосов
/ 03 марта 2010

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

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

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

Ответы [ 13 ]

14 голосов
/ 03 марта 2010
while (GetWhitespace(textStream))
    ;
11 голосов
/ 03 марта 2010

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

while(Foo(x++)) ;

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

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

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

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

5 голосов
/ 03 марта 2010

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

while(DoSomething()) ;

и

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

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

3 голосов
/ 03 марта 2010

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

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

или

while (testSomeCondition());

То есть, запустить цикл с пустым телом, где "мясо" находится внутри скобок.

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

2 голосов
/ 03 марта 2010

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

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

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

if(true)
#if(DEBUG)
   System.Console.WriteLine("Debug comment")
#endif
;
1 голос
/ 03 марта 2010

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

1 голос
/ 03 марта 2010

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

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

1 голос
/ 03 марта 2010

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

while (!SomeCondition)
    ; // <-- body of the while loop is an empty statement
0 голосов
/ 15 октября 2018

Представьте, что у вас есть код, который вы хотите расширить с помощью новой функции:

void DoSomething()
{
    // ...
    NewMethod();
}

Теперь вы вводите нового члена с именем NewMethod. Однако у вас нет времени, чтобы реализовать это должным образом и оставить пустым:

public void NewMethod() { }

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

Вы также можете создать интерфейс, который вы не реализуете. Таким образом, вы определяете только что делать, но не как .

Другой возможный сценарий - иметь член virtual, который обычно ничего не делает, но в некоторых случаях (в некоторых конкретных реализациях) вы хотите, чтобы метод возвращал специфическое значение. См. Этот пост, например: Виртуальные методы без тела

0 голосов
/ 04 марта 2010

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

...