我今天正在浏览同事c#代码并发现以下内容:
using (MemoryStream data1 = new MemoryStream())
using (MemoryStream data2 = new MemoryStream())
{
// Lots of code..........
}
我一直看到using
语句后跟一对花括号,它们定义了对象生命的范围。编写代码的同事表示,不需要data1
using
语句的大括号,代码执行相同的操作,就像它们存在并嵌套data2
{{ 1}}陈述。那么,当花括号被省略时会发生什么?
答案 0 :(得分:103)
是的,您也可以将它们放在一个使用声明中:
using (MemoryStream data1 = new MemoryStream(),
data2 = new MemoryStream())
{
// do stuff
}
答案 1 :(得分:18)
当您在for
或if
语句中省略大括号时,适用相同的规则。
顺便提一下,如果您反映到已编译的代码中,编译器反编译器会添加大括号。
答案 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();
}