我发现了一些有趣的东西,但我似乎无法找到更多信息或合适的名称。
我想我们大多数人都知道,如果您有多个 using
block ,您只需要在最后一个 using
之后包含方括号:
using (FileStream fileStream = new FileStream(zipFilePath, FileMode.Open))
using (ZipInputStream zipStream = new ZipInputStream(fileStream))
{
//stuff
}
然而,四处闲逛我发现下面的代码也可以工作,没有紧跟在 using
后面的括号,搭载 while
:
using (BinaryWriter br = new BinaryWriter(context.Response.OutputStream))
while (true)
{
//stuff
}
有人知道这种允许代码块合并的语言“特性”的名称吗?
最佳答案
是的,这是有意的。它是 C♯ 从 C 和 C++ 继承而来的一个习语。如果您有一个包含在大括号中的语句,则大括号通常是可选的。是否使用它们主要是风格和可读性的问题。对于嵌套的 using
语句,通常省略外层的大括号。
语言语法
在语法术语中,using
block 后跟一个语句。通常这是一个 block 语句,但也不是必须的。
有多种说法。有表达式语句,例如a = b;
。有 迭代语句,例如 while (boolean-expression) { ... }
。这里整个 while
循环算作一个语句。还有 block 语句,它由一个或多个用花括号括起来的语句组成。
请参阅 C# 语言规范,附录 C 语法,§C.2.5 Statements对于语句的正式规范:
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-listopt}
如果只有一个语句,通常可以省略语句周围的花括号。这些是等价的:
if (condition) statement;
if (condition) { statement; }
这些都是:
using (...)
using (...)
statement;
using (...)
using (...)
{
statement;
}
using (...)
{
using (...)
{
statement;
}
}
有时需要
也有需要大括号的异常(exception)情况。方法体必须始终有花括号。它融入了语法。
method-body:
block
;
同样,try
/catch
/finally
子句必须有大括号。 checked
和 unchecked
也是一样。你可以在语法中看到这一点。 catch 子句被定义为“catch block”而不是“catch statement”。
try-statement:
try
block catch-clauses
try
block finally-clause
try
block catch-clauses finally-clause
specific-catch-clause:
catch
(
class-type identifieropt)
block
general-catch-clause:
catch
block
finally-clause:
finally
block
checked-statement:
checked
block
unchecked-statement:
unchecked
block
这是为什么?简短的回答是它消除了语法中的歧义。有关深入解释,请参阅 Eric Lippert's explanation of this inconsistency.
关于c# - 可选嵌套?这个语言功能叫什么,它的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13939607/