c# - 可选嵌套?这个语言功能叫什么,它的用途是什么?

标签 c#

我发现了一些有趣的东西,但我似乎无法找到更多信息或合适的名称。

我想我们大多数人都知道,如果您有多个 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 子句必须有大括号。 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:
    
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/

相关文章:

c# - 在 C# 中处理非托管对象

c# - 如何将参数传递给 BaseController 并在 Controller 中使用它们

c# - 我正忙于编写 C# IBM MQ 客户端应用程序,并不断收到 "Exception: The type initializer for ' IBM.WMQ.Nmqi.UnmanagedNmqiMQ' 抛出异常。”

c# - 如何在 WinRT View 中加载时禁用对文本框的焦点?

c# - Web API 2 session

C# : public observablecollection<ViewModel> instance pass items to protected observablecollection<ViewModel>

c# - 获得 Entity Framework 6 的最佳性能,如 Dapper.NET

c# - 如何创建序列号生成器?

c# - Windows 窗体 DataGridView 的速度与 SQL Server Management Studio 中的一样

c# - 检查一个列表元素中的元素是否存在于另一列表中