Почему методы с одним утверждением нужны брекеты?
-
14-11-2019 - |
Вопрос
public void Finalise()
ProcessFinalisation(true);
.
не скомпилируется, а правильная версия:
public void Finalise()
{
ProcessFinalisation(true);
}
.
компилируется нормально (конечно).
Если мне разрешено, если без скобок, когда следующий код имеет только одну строку:
if(true)
CallMethod();
.
Почему то же самое не разрешено для методов с одной следующей?Есть ли техническая причина?
Решение
С момента C # 6.0 вы можете объявить:
void WriteToConsole(string word) => Console.WriteLine(word)
.
а затем назовите его как обычно:
public static void Main()
{
var word = "Hello World!";
WriteToConsole(word);
}
. Другие советы
Очевидный ответ - это спецификация языка;Для рассуждений ... Я думаю, в основном простота - это просто не стоит накладных расходов, проверяющих здравомыслие спецификации и компилятора для THE TINY TINY Количество методов одного оператораОтказВ частности, я потенциально могу видеть проблемы с общими ограничениями и т. Д. (I.E. where T : IBlah, new()
в конце подписи).
Обратите внимание, что не используя брекеты, иногда могут привести к двусмыслению, а в некоторых местах нахмурится.Я немного более прагматичен, чем это лично, но каждый для их собственного.
Это может быть также интересен, чтобы C # внутри бритвы не позволяет использовать использование без явных скобок.Вообще (то есть даже для if
и т. Д.).
Marc в основном справа. Чтобы увеличить его ответ: есть ряд мест, где 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 Уполномоченный синтаксис, который мы все знаем и Love:
int function(int arg1, int arg2)
{ code }
.
Но не позволил неразрешенным функциям, потому что они приведут к ущерному ущерну старые компиляторы, которые знали только синтаксис K & R [и поддержку для объявлений K & R].
Время продолжалось, и годы спустя C # был разработан вокруг C [или C ++, в том же разнице в условиях синтаксиса] и, поскольку C не позволял неразрешенным функциям, ни C #.