Почему методам с одним оператором нужны скобки? - PullRequest
8 голосов
/ 16 мая 2011
public void Finalise()
    ProcessFinalisation(true);

Не компилируется, но правильная версия:

public void Finalise()
{
    ProcessFinalisation(true);
}

Прекрасно компилируется (конечно).

Если мне разрешено if без скобок, когда следующий код имеет только одну строку:

if(true)
    CallMethod();

Почему то же самое не разрешено для методов с одной следующей строкой? Есть ли техническая причина?

Ответы [ 4 ]

14 голосов
/ 16 мая 2011

Очевидный ответ - языковая спецификация; для рассуждений ... я предполагаю, в основном, простоту - это просто не стоило затрат на проверку работоспособности спецификации и компилятора для крошечного крошечного количества методов с одним оператором. В частности, я потенциально могу видеть проблемы с общими ограничениями и т. Д. (Т. Е. where T : IBlah, new() в конце подписи).

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

Также может быть интересно, что C # внутри бритвы не позволяет использовать без явных скобок. На всех (т.е. даже для if и т. Д.).

11 голосов
/ 16 мая 2011

Марк в основном прав. Чтобы немного расширить его ответ: есть ряд мест, где C # требует ограниченного блока операторов, а не допускает «голый» оператор. Это:

  • тело метода, конструктора, деструктора, средства доступа к свойствам, средства доступа к событиям или средства индексирования.
  • блок области «попробуй, поймай, наконец, проверил, не проверял или небезопасен».
  • блок оператора лямбда или анонимный метод
  • блок оператора if или цикла, если блок непосредственно содержит объявление локальной переменной. (То есть «while (x! = 10) int y = 123;» недопустимо; вы должны заключить декларацию.)

В каждом из этих случаев можно было бы придумать однозначную грамматику (или эвристику для устранения неоднозначности грамматической грамматики) для функции, в которой допустимо одно несвязанное утверждение. Но какой в ​​этом смысл? В каждой из этих ситуаций вы ожидаете увидеть несколько утверждений; отдельные заявления - редкий, маловероятный случай. Кажется, что не стоит делать грамматику однозначной для этих очень маловероятных случаев.

2 голосов
/ 05 апреля 2016

Начиная с C # 6.0, вы можете объявить:

void WriteToConsole(string word) => Console.WriteLine(word)

А затем назовите это как обычно:

public static void Main()
{
    var word = "Hello World!";
    WriteToConsole(word);
}
1 голос
/ 18 ноября 2011

Краткий ответ: C # разрабатывается после C, и C требует, чтобы функции были заключены в скобки из-за того, как раньше были объявления функций C.

Длинная версия с историей: в K & R C функции были объявлены следующим образом:

int function(arg1, arg2)
int arg1;
int arg2;
{ code }

Конечно, у вас не может быть свободных функций в этом расположении.ANSI C предписал синтаксис, который мы все знаем и любим:

int function(int arg1, int arg2)
{ code }

, но не разрешаем функции без скобок, потому что они могут привести к хаосу со старыми компиляторами, которые знают только синтаксис K & R [и поддержка объявлений K & R все еще требуется].

Время шло, и спустя годы C # был разработан вокруг C [или C ++, с той же разницей в синтаксисе], и, поскольку C не разрешал функции без скобок, ни C #.

...