Почему методы только с одним оператором нуждаются в фигурных скобках?
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#.