Вопрос по c#, syntax, language-design – Таким образом, даже несмотря на то, что приведенный выше код выполняется линейно, структура кода представляет собой «реальную» структуру объектов, что облегчает понимание, поддержку и расширение другими разработчиками.

83

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

void Main()
{
    {   // any sense in this?
        Console.Write("foo");
    }
}
Но, как показывают ответы, это имеет большее значение, чем просто «не больно, так что позвольте этому». Это вопрос о том, чтобы задавать такие вопросы. Seldon
Есть ли причинане должен? Jamiec
@Akash: Не спрашивая почему, мы никогда не поправимся. richard
+1 вопрос звучит достаточно невинно, но ответы действительно научили меня чему-то ценному Nicolas78
@Akash: Это похоже на элитарное отношение. У людей всегда есть вопросы, и если нет причин спрашивать, почему, то нет смысла иметь SO. Этот сайт предназначен не только для того, чтобы люди решали наши насущные проблемы (хотя это происходит), но и для того, чтобы предоставить хранилище вопросов и ответов, которые помогут всем нам стать лучшими программистами. ТАК ЗА спрашивать ПОЧЕМУ! :-) richard

Ваш Ответ

9   ответов
17

{} как утверждение, которое может содержать несколько утверждений.

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

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

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

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

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

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

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

+1 Это именно то, что скобки в языках стиля C - так называемое «сложное утверждение». Michael Ekstrand
87

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

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

1 Если, конечно, вы не решите попробовать быть смешным и создать свой собственныйConsole класс, сWrite() метод, который делает что-то совершенно неожиданное.

Re: другие языки: обычно, но не всегда. JavaScript является заметным исключением; объявление локальной переменной в конкретном блоке не ограничивает переменную до блока. Eric Lippert
А в C ++ из-за RAII вместо GC это гораздо полезнее. Deduplicator
@EricLippert: В C #, объявление переменной внутри блока вызывает область видимости переменной с точки зрения времени выполнения? Из того, что я могу сказать, время жизни переменных часто не ограничено областями видимости - факт, который наблюдается в проектах на разных языках, если первое, что делается с переменной в цикле, - это передать ее какout параметр реализации интерфейса, написанный на другом языке, и эта реализация считывает переменную перед ее записью. supercat
141

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

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

@ Jay Bazuzi, только потому, что я хочу иметь локальную переменную с одинаковым именем в более чем одном случае, не означает, что они должны быть огромными. Вы просто прыгаетеогромный выводы ... :) João Angelo
+1 за наличие аватара в соответствии с вопросом! :) Jaymz
Если вам нужны прицелы в ваших случаях, они слишком большие! Метод извлечения. Jay Bazuzi
@BoltClock, спасибо, мне просто нужно еще несколько вопросов о{} чтобы сохранить эти золотые значки ... :) João Angelo
Это стоит прочитатьblogs.msdn.com/b/ericlippert/archive/2009/08/03/... Dan Diplo
11

{ } следует рассматривать как одно утверждение, и оно может идти везде, где только одно утверждение ":

Послеif.Послеfor, while или жеdo.Везде в коде.

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

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

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

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

0

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

Лично я использую блоки кода без операторов в 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

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.

55

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

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

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

{
    {
        int i = 0;
    }

    {
        int i = 0;
    }
}

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

{
    {
        int i = 0;
    }

    i = 1;
}

И так далее, и так далее.

Хороший вопрос! Я думаю, мой наставник заложил это в моем мозгу десять лет назад. Наверное, мне следует называть их «фигурные скобки» или «фигурные скобки». Каждому свое ...en.wikipedia.org/wiki/... Chris Wallis
Я читал о различиях в скобочной номенклатуре в различных вариантах английского языка, но в какой{} известный как скобки? BoltClock♦
+1 за любезное принятие. FumbleFingers
В моем словаре '(' = круглые скобки, '{' = фигурные скобки, '[' = квадратные скобки pb.
@BoltClock, @pb. Хорошо, хорошо, я представляю - отредактировано: -} Chris Wallis
1

атора.

C ++ позволил им, потому что C сделал.

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

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

Действительно, это правильный ответ. Далее я просто отвечу«Потому что каждый компьютерный язык делает». Fattie
Вы имеете в виду Module2 или Modula2? Richard Everett
1
// if (a == b)
// if (a != b)
{
    // do something
}

Похожие вопросы