Can the C# using statement be written without the curly braces?

I was browsing a coworkers c# code today and found the following:

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

I had always seen the using statement followed by a pair of curly braces that defined the scope of the object life. My coworker who wrote the code said that the curly braces for the data1 using statement weren't needed and the code did the same thing as if they were present and nested the data2 using statement. So, what happens when the curly braces are ommitted?

43
задан Glorfindel 25 September 2019 в 10:57
поделиться

6 ответов

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

using (MemoryStream data1 = new MemoryStream(), 
                    data2 = new MemoryStream())
{
    // do stuff
}
103
ответ дан 26 November 2019 в 22:26
поделиться

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

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

18
ответ дан 26 November 2019 в 22:26
поделиться

То, что сказал ваш коллега, эквивалентно вложению утверждений. Dispose для data2 будет вызываться непосредственно перед функцией dispose для data1 .

3
ответ дан 26 November 2019 в 22:26
поделиться

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

4
ответ дан 26 November 2019 в 22:26
поделиться

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

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

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

if(true)
   Console.Writeline("hello")
1
ответ дан 26 November 2019 в 22:26
поделиться

Именно то, что он сказал. Приведенный выше код в точности совпадает с записью:

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();
}
17
ответ дан 26 November 2019 в 22:26
поделиться
Другие вопросы по тегам:

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