Почему методы только с одним оператором нуждаются в фигурных скобках?

public void Finalise()
    ProcessFinalisation(true);

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

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

компилирует нормально (естественно).

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

if(true)
    CallMethod();

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

4 ответов


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

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

и затем назовите его, как обычно:

public static void Main()
{
    var word = "Hello World!";
    WriteToConsole(word);
}

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

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

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


Марк в основном прав. Чтобы немного расширить его ответ: есть несколько мест, где C# требует связанного блока утверждений, а не позволяет "голое" утверждение. Они:

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

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


короткий ответ: 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#.