Можно ли написать инструкцию С# без фигурных скобок?

Сегодня я просматривал код С# сотрудников и нашел следующее:

    using (MemoryStream data1 = new MemoryStream())
    using (MemoryStream data2 = new MemoryStream())
    {
        // Lots of code..........
     }

Я всегда видел инструкцию using, а затем пару фигурных скобок, которые определяли сферу жизни объекта. Мой коллега, написавший код, сказал, что фигурные скобки для оператора data1 using не нужны, а код сделал то же самое, что и они присутствовали и вложили в инструкцию data2 using. Итак, что происходит, когда фигурные скобки опущены?

Ответ 1

Да, вы также можете поместить их в один оператор:

using (MemoryStream data1 = new MemoryStream(), 
                    data2 = new MemoryStream())
{
    // do stuff
}

Ответ 2

Те же правила применяются, если вы опускаете фигурные скобки в инструкции for или if.

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

Ответ 3

Именно то, что он сказал. Вышеупомянутый код точно такой же, как и запись:

using (MemoryStream data1 = new MemoryStream()) 
{
    using (MemoryStream data2 = new MemoryStream())
    {
        // Lots of code
    }
}

Вы можете опустить фигурные скобки после команды if/else/for/while/using/etc, если в инструкции есть только одна команда. Примеры:

// Equivalent!
if (x==6) 
    str = "x is 6";

if(x == 6) {
    str = "x is 6";
}

// Equivalent!
for (int x = 0; x < 10; ++x) z.doStuff();

for (int x = 0; x < 10; ++x) {
    z.doStuff();
}

// NOT Equivalent! (The first one ONLY wraps the p = "bob";!)
if (x == 5) 
p = "bob";
z.doStuff();

if (x == 5) {
   p = "bob";
   z.doStuff();
}

Ответ 4

Это жизнеспособно, но рискованно, потому что, если кто-то позже решит, что они хотят что-то сделать с данными1, прежде чем что-то случится с ним, они могут поместить его сразу после использования data1, который выведет его из всей области данных2, используя, Это, скорее всего, нарушит компиляцию, но все же будет рискованным и бессмысленным ярлыком синтаксиса.

Ответ 5

Именно то, что сказал ваш коллега, это эквивалент вложения утверждений. Упорядочить для data2 вызывается непосредственно перед функцией удаления для data1.

Ответ 6

Если есть только одна инструкция, которая следует за инструкцией, скобки не нужны. Это похоже на инструкцию if.

if(true)
{
   Console.Writeline("hello")
}

означает то же самое, что

if(true)
   Console.Writeline("hello")

Ответ 7

Как говорили люди: если после утверждения есть только одна строка, она будет работать без скрученных скобок. Тем не менее, люди не показывают в своих примерах, что эта строка может быть if/using/for с ее собственными скрученными фигурными скобками. Вот пример:

if(foo)
  if(bar)
  {
     doStuff();
  }