Подтвердить что ты не робот

Как работает этот, казалось бы, незакрепленный блок (после оператора if)?

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

if (a)
    foo();
{
    if (b)
        boo();
    moo();
}

Я не уверен, как это естественно читать, но код компилируется и запускается.

Может кто-нибудь объяснить, как это работает, чтобы я мог переписать его в более удобочитаемом формате? В качестве альтернативы, может кто-нибудь объяснить, почему эта нотация может быть полезна?

4b9b3361

Ответ 1

Код, который вы опубликовали, будет лучше написан как:

   if (a)
   {
       foo();
   }
   if (b)
   {
       boo();
   }
   moo();

Скобки в С# имеют две цели:

  • Они создают область для объявлений переменных.
  • Они группируют операторы вместе так, что условные обозначения и циклы и т.д. могут применяться к нескольким операциям за раз.

Тот, кто написал код, который вы опубликовали, решил не использовать их для второй цели. Операторы if могут быть полностью законными без использования каких-либо фигурных скобок, но они будут применяться только к оператору, который сразу же следует за ними (например, вызов foo() после первого if).

Поскольку существует законный прецедент для фигурных скобок, который не имеет ничего общего с потоком управления, однако, вполне приемлемо, чтобы кто-то поставил фигурные скобки в случайных местах, которые не имеют никакого отношения к операторам if.

Этот код:

foo();
{
   var a = boo();
}
{
   var a = moo();
}

... эквивалентен этому коду:

foo();
var a = boo();
var b = moo();

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

В качестве альтернативы, может кто-нибудь объяснить, почему эта нотация может быть полезна?

Есть три возможности, о которых я могу думать:

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

Первые две возможности предполагают, что они фактически выполняют больше, чем вызов foo() и moo() в реальном производственном коде.

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

Ответ 2

Фигулярная фигурная скобка начинается после foo() вместо if(a) (например, if(a){), поэтому эти скобки бесполезны в этом контексте.

if (a)
    foo();
//{
    if (b)
        boo();
    moo();
//}

который равен

if (a)
    foo();

if (b)
    boo();

moo();

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