可选嵌套?这个语言功能叫做什么,它的目的是什么?

ove*_*ked 5 c#

我遇到了一些有趣的东西,我似乎无法找到更多的信息,或者是一个正确的名称.

我想我们大多数人都知道如果你有多个using块,你只需要在最后一个之后包括括号using:

using (FileStream fileStream = new FileStream(zipFilePath, FileMode.Open))
using (ZipInputStream zipStream = new ZipInputStream(fileStream))
{
    //stuff
}
Run Code Online (Sandbox Code Playgroud)

然而,在我周围发现,我发现以下代码也可以工作,没有紧随其后的括号using,捎带while:

using (BinaryWriter br = new BinaryWriter(context.Response.OutputStream))
while (true)
{
    //stuff
}
Run Code Online (Sandbox Code Playgroud)

有谁知道这种语言"功能"的名称,允许代码块合并?

Joh*_*ica 7

是的,这是有意的.这是C♯继承自C和C++的习语.如果您有一个用大括号括起来的单个语句,则大括号通常是可选的.无论您是否使用它们,都是风格和可读性的问题.对于嵌套using语句,通常省略外层的大括号.

语言语法

在语法术语中,using块后面跟一个语句.通常这是一个块语句,但它不一定是.

有各种各样的陈述.有表达式声明,a = b;.有迭代语句,while (boolean-expression) { ... }.这里整个while循环计为单个语句.还有块语句,它由一个或多个括在花括号中的语句组成.

参见C#语言规范,附录C.语法,§C.2.5声明正式规范的声明:

statement:
    labeled-statement
    declaration-statement
    embedded-statement
embedded-statement:
    block
    empty-statement
    expression-statement
    selection-statement
    iteration-statement
    jump-statement
    try-statement
    checked-statement
    unchecked-statement
    lock-statement
    using-statement
block:
    
{ statement-列表选择 }

如果您有一个语句,通常可以省略语句周围的花括号.这些是等价的:

if (condition) statement;
if (condition) { statement; }
Run Code Online (Sandbox Code Playgroud)

这些是:

using (...)
using (...)
    statement;

using (...)
using (...)
{
    statement;
}

using (...)
{
    using (...)
    {
        statement;
    }
}
Run Code Online (Sandbox Code Playgroud)

有时需要

有些例外情况需要花括号.方法体必须始终具有花括号.它融入了语法.

method-body:
    block
    
;

同样,try/ catch/ finally子句必须有花括号.同样的事情checkedunchecked.你可以在语法中看到这一点.catch子句定义为"catch block "而不是"catch statement ".

try-statement:
    
try block catch-clauses
    
try block finally-clause
    
try block catch-clauses finally-clause
specific-catch-clause:
    
class-type identifier opt block general-catch-clause: block finally-clause: block checked-statement: block unchecked-声明:catch ( )

    
catch

    
finally

    
checked

    
unchecked

为什么是这样?简短的回答是它消除了语法中的含糊之处.有关深入解释,请参阅Eric Lippert对此不一致的解释.