52

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

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

我总是看到using语句后面跟着一对定义对象生命范围的花括号。编写代码的同事说,语句的花括号data1 using不需要,并且代码的作用与它们存在并嵌套data2 using语句一样。那么,省略大括号时会发生什么?

4

8 回答 8

110

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

using (MemoryStream data1 = new MemoryStream(), 
                    data2 = new MemoryStream())
{
    // do stuff
}
于 2010-08-17T20:30:20.017 回答
21

for当您在 a或if语句中省略花括号时,同样的规则适用。

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

于 2010-08-17T20:25:17.230 回答
19

从 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

于 2020-03-27T10:08:49.597 回答
18

正是他所说的。上面的代码和写的完全一样:

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();
}
于 2010-08-17T20:30:05.363 回答
4

这是可行的,但有风险,因为如果有人后来决定他们想在其他事情发生之前对 data1 做某事,他们可能会在 data1 的使用之后立即将其放置在 data1 的整个使用范围之外。这可能会破坏编译,但仍然是一个冒险且毫无意义的语法捷径。

于 2010-08-17T20:31:13.717 回答
3

正是你的同事所说的,这相当于嵌套语句。dispose fordata2将在 for 的 dispose 函数之前立即调用data1

于 2010-08-17T20:25:59.430 回答
2

正如人们所说:鉴于语句后面只有一行,它可以在没有花括号的情况下工作。然而,人们忽略了在他们的例子中表明这一行可以是 if/using/for 和它自己的花括号。这是一个例子:

if(foo)
  if(bar)
  {
     doStuff();
  }
于 2018-01-17T09:48:57.570 回答
1

如果语句后面只有一条指令,则不需要大括号。就像 withif语句一样。

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

意思是一样的

if(true)
   Console.Writeline("hello")
于 2010-08-17T20:27:34.183 回答