Почему методы с одним утверждением нужны брекеты?

StackOverflow https://stackoverflow.com/questions/6016654

  •  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 #.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top