我遇到了一些有趣的东西,我似乎无法找到更多的信息,或者是一个正确的名称.
我想我们大多数人都知道如果你有多个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)
有谁知道这种语言"功能"的名称,允许代码块合并?
是的,这是有意的.这是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子句必须有花括号.同样的事情checked和unchecked.你可以在语法中看到这一点.catch子句定义为"catch block "而不是"catch statement ".
try-statement:
tryblock catch-clauses
tryblock finally-clause
tryblock 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对此不一致的解释.