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

我今天浏览了一个同事c#代码,发现以下内容:

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

我总是看到using语句,后面跟着一对确定物体生命范围的花括号。 我编写代码的同事说, data1 using语句的花括号不是必须的,代码做了同样的事情,就好像它们存在并嵌套data2 using语句。 那么,当大括号被省略时会发生什么?

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

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

forif语句中省略花括号时,也适用相同的规则。

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

到底他在说什么 上面的代码和写作完全一样:

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

你的同事说的确实是这样,相当于嵌套陈述。 在data1的处理函数之前立即调用data2的处理。

这是可行的,但是也是有风险的,因为如果有人稍后决定在数据发生之前想要对数据做些什么的话,他们可能会在数据1使用之后立即放置数据,这将会把数据全部用到数据2的使用范围之外。 这可能会破坏编译,但仍然是一个风险和毫无意义的语法快捷方式。

如果语句后面只有一条指令,则不需要该指令。 就像if语句一样。

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

意味着相同的

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