C#using语句是否可以在没有花括号的情况下编写?

时间:2010-08-17 20:23:57

标签: c#

我今天正在浏览同事c#代码并发现以下内容:

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

我一直看到using语句后跟一对花括号,它们定义了对象生命的范围。编写代码的同事表示,不需要data1 using语句的大括号,代码执行相同的操作,就像它们存在并嵌套data2 {{ 1}}陈述。那么,当花括号被省略时会发生什么?

8 个答案:

答案 0 :(得分:103)

是的,您也可以将它们放在一个使用声明中:

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

答案 1 :(得分:18)

当您在forif语句中省略大括号时,适用相同的规则。

顺便提一下,如果您反映到已编译的代码中,编译器反编译器会添加大括号。

答案 2 :(得分:16)

他说的正是如此。上面的代码与写作完全相同:

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();
}

答案 3 :(得分:10)

在C#8中,您也可以使用以下语法而无需大括号:

using var foo = new Foo();
var bar = foo.Bar();

foo将被放置在其作用域的末尾(通常在方法的末尾)-请注意在何处以及何时使用。

参考-https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement#example

答案 4 :(得分:4)

这是可行但有风险的,因为如果有人后来决定他们想要在其他事情发生之前对data1做一些事情,他们可能会在data1使用之后将其放置,这会将其从数据2的整个范围中取出。这可能会破坏编译,但仍然是一个冒险且毫无意义的语法快捷方式..

答案 5 :(得分:3)

正是你的同事所说的,这相当于嵌套陈述。 data2的处置将在data1的处置函数之前立即调用。

答案 6 :(得分:1)

如果声明后面只有一条指令,则不需要括号。就像if声明一样。

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

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

答案 7 :(得分:1)

正如人们所说的那样:鉴于声明之后只有一行,它将在没有卷曲的括号的情况下工作。然而,人们忽略了在他们的例子中表明,一条线可以是if / using / for它自己的卷曲括号。这是一个例子:

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