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

Dav*_*veB 43 c# using-statement

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

    using (MemoryStream data1 = new MemoryStream())
    using (MemoryStream data2 = new MemoryStream())
    {
        // Lots of code..........
     }
Run Code Online (Sandbox Code Playgroud)

我一直看到using声明后跟一对花括号,它们定义了对象生命的范围.我编写代码的同事说,data1 using语句的大括号不需要,代码做的就像它们存在并嵌套data2 using语句一样.那么,当花括号被省略时会发生什么?

Alb*_*nbo 103

是的,您也可以将它们放在一个using语句中:

using (MemoryStream data1 = new MemoryStream(), 
                    data2 = new MemoryStream())
{
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果它们都是相同的类型,则只能在一个`using`语句中放置多个对象,在本例中为"MemoryStream". (23认同)
  • 从C#规范:"``using`语句形式`using(ResourceType r1 = e1,r2 = e2,...,rN = eN)语句`完全等同于嵌套`using`语句的序列:使用(ResourceType r1 = e1)使用(ResourceType r2 = e2)...使用(ResourceType rN = eN)语句`" (5认同)

Chu*_*way 18

当您在一个for或一个if语句中省略花括号时,适用相同的规则.

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

  • +1,nitpick point:编译器实际上没有添加大括号,反编译器将它们放入. (7认同)
  • 一个区别是,当嵌套`for`语句时,我们会缩进内部语句,但嵌套的`using`语句通常是左对齐的.当然,这是一个常见的约定,而不是语言语法. (2认同)

JvR*_*JvR 18

从 C# 8 开始,您也可以不使用任何大括号使用此语法:

using var foo = new Foo();
var bar = foo.Bar();
Run Code Online (Sandbox Code Playgroud)

foo 然后将在其范围的末尾(通常在方法的末尾)进行处理 - 所以要注意在何处和何时使用。

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

  • 刚刚被这个新语法抓住了:我有一个代码块,其中包含这些新的“using”之一,我将其重构为一个返回一次性对象的新方法。当然,这导致了运行时错误。如果大括号在那里,它将清楚地指示变量的范围,并警告这不是一个简单的重构。 (3认同)

Ste*_*hen 17

正是他所说的.上面的代码与编写完全相同:

using (MemoryStream data1 = new MemoryStream()) 
{
    using (MemoryStream data2 = new MemoryStream())
    {
        // Lots of code
    }
}
Run Code Online (Sandbox Code Playgroud)

只要在语句中只有一个命令,就可以在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();
}
Run Code Online (Sandbox Code Playgroud)