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 }
在for
或if
语句中省略花括号时,也适用相同的规则。
顺便说一句,如果你反映到编译的代码, 编译器反编译器添加大括号。
到底他在说什么 上面的代码和写作完全一样:
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")