Почему C # допускает блоки кода {} без предшествующего оператора? - PullRequest
83 голосов
/ 26 мая 2011

Почему C # допускает блоки кода без предшествующего оператора (например, if, else, for, while)?

void Main()
{
    {   // any sense in this?
        Console.Write("foo");
    }
}

Ответы [ 9 ]

141 голосов
/ 26 мая 2011

У { ... } есть как минимум побочный эффект от введения новой области видимости для локальных переменных.

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

87 голосов
/ 26 мая 2011

В контексте, который вы даете, значение не имеет.Запись постоянной строки в консоль будет работать одинаково в любом месте потока программы. 1

Вместо этого вы обычно используете их, чтобы ограничить область действия некоторых локальных переменных.Это дополнительно уточняется здесь и здесь .Посмотрите на ответ Жуана Анджело и ответ Криса Уоллиса для кратких примеров.Я полагаю, что то же самое относится и к некоторым другим языкам с синтаксисом в стиле C, но не то, чтобы они были актуальны для этого вопроса.конечно, вы решаете попробовать быть смешным и создать свой собственный класс Console с помощью метода Write(), который делает что-то совершенно неожиданное.

55 голосов
/ 26 мая 2011

Это не столько особенность C #, сколько логический побочный эффект многих синтаксических языков C, которые используют фигурные скобки для определения области действия .

В вашем примере фигурные скобки не имеют никакого эффекта вообще, но в следующем коде они определяют область действия и, следовательно, видимость переменной:

Это разрешено , когда я выпадаю изобласть действия в первом блоке и определяется снова в следующем:

{
    {
        int i = 0;
    }

    {
        int i = 0;
    }
}

Этот недопустим , так как я выпал из области видимости и больше не виден во внешней области видимости:

{
    {
        int i = 0;
    }

    i = 1;
}

И т. Д. И т. П.

17 голосов
/ 26 мая 2011

Я считаю {} оператором, который может содержать несколько операторов.

Рассмотрим оператор if, который существует из логического выражения, за которым следует one . Это будет работать:

if (true) Console.Write("FooBar");

Это также будет работать:

if (true)
{
  Console.Write("Foo");
  Console.Write("Bar");
}

Если я не ошибаюсь, это называется оператором блока.

Поскольку {} может содержать другие операторы, он также может содержать другие {}. Область действия переменной определяется ее родителем {} (оператор блока).

Смысл, который я пытаюсь сделать, заключается в том, что {} - это просто утверждение, поэтому оно не требует, если или что-то еще ...

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

Общее правило в языках C-синтаксиса: «все, что находится между { }, следует рассматривать как один оператор, и оно может идти везде, где мог бы один оператор»:

  • После if.
  • После for, while или do.
  • В любом месте кода .

Для всех намеренийи цели, это как грамматика языка, включенная в это:

     <statement> :== <definition of valid statement> | "{" <statement-list> "}"
<statement-list> :== <statement> | <statement-list> <statement>

То есть «утверждение может состоять из (различные вещи) или из открывающей скобки, за которым следует операторсписок (который может включать одно или несколько утверждений), за которым следует закрывающая скобка ".IE "блок { } может заменить любой оператор, где угодно".Включение в середину кода.

Если не допустить блока { } в любом месте, куда может пойти один оператор, фактически определение языка станет более сложным .

1 голос
/ 07 июня 2011
// if (a == b)
// if (a != b)
{
    // do something
}
1 голос
/ 26 мая 2011

Поскольку C ++ (и java) допускают блоки кода без предшествующего оператора.

C ++ разрешает их, потому что это делает C.

Можно сказать, что все это сводится к тому, что язык программирования США(На основе C) дизайн выиграл, а не на европейском языке программирования ( на основе Modula-2 ).

(операторы управления действуют на один оператор, операторы могут быть группами для создания новых операторов)

0 голосов
/ 21 марта 2018

Вы спросили «почему» C # допускает блоки кода без предшествующих операторов.Вопрос «почему» также может быть истолкован как «какие будут возможные преимущества этой конструкции?»

Лично я использую блоки кода без операторов в C #, где читаемость значительно улучшена для других разработчиков, сохраняя при этомИмейте в виду, что блок кода ограничивает область действия локальных переменных.Например, рассмотрим следующий фрагмент кода, который намного легче читать благодаря дополнительным блокам кода:

OrgUnit world = new OrgUnit() { Name = "World" };
{
    OrgUnit europe = new OrgUnit() { Name = "Europe" };
    world.SubUnits.Add(europe);
    {
        OrgUnit germany = new OrgUnit() { Name = "Germany" };
        europe.SubUnits.Add(germany);

        //...etc.
    }
}
//...commit structure to DB here

Я знаю, что это можно решить более элегантно, используя методы для каждого уровня структуры,Но опять же, имейте в виду, что такие вещи, как образцы данных, как правило, должны быть быстрыми.

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

0 голосов
/ 23 мая 2012

1 Поскольку ... Поддерживает область действия оператора .. или Функции, это действительно полезно для большого кода ..

{
    {
        // Here this 'i' is we can use for this scope only and out side of this scope we can't get this 'i' variable.

        int i = 0;
    }

    {
        int i = 0;
    }
}

enter image description here

...