【问题标题】:Why is a semi-colon instead of an empty block not always valid?为什么分号而不是空块并不总是有效的?
【发布时间】:2015-05-31 20:59:04
【问题描述】:

我一直在想这个问题;为什么使用分号 ; 而不是空块 {} 并不总是有效的?在whileforifelse 等语句上使用它时可以使用它。但它不适用于trycatchfinallydelegate(可能更少)留空有用)。

所以这样做是有效的:

while(shouldIWait()); // This is normal

try {
    doThing(); // Might throw an exception
} catch { } // Ignore the exception

但这不会:

try {
    doThing(); // Might throw an exception
} catch; // Syntax error!

据我了解,始终可以使用分号代替空块。为什么这仅限于某些陈述? { }; 后面语句的用法有真正的区别吗?

【问题讨论】:

  • 你也不能使用分号作为一个空的方法体。
  • @Dennis_E 这个问题更像是一个逻辑流问题。就像这样做:if(foo) if(bar) baz(); else bor(); else beer();
  • 这是 C# 规范所要求的。请参阅第 8 章,声明。具体来说,if 语句(第 8.7.1 节)包含一个 embedded-statement,而try 语句(第 8.10 节)包含一个embedded-statement 可以是多种事物中的任何一种,其中只有一个是 block (8.2)。另一个是empty-statement (8.3)。有关这些定义,请参见第 8 章的开头。
  • 感谢@JeppeStigNielsen,阅读第 8.7.1、8.8(部分)和 8.10 章节后,其背后的推理变得更加清晰。 C# 规范本身对我来说似乎是一本好书。

标签: c# syntax


【解决方案1】:

在某些情况下,代码块是可选的,在某些情况下是必需的。

如果是类或结构的方法,则需要一段代码(除非它是抽象或部分方法)。

在捕获的情况下,还需要一段代码(用于处理异常)。创建一个空的 catch-block 被认为是糟糕的编程。

【讨论】:

  • 技术上(来自 C# 语言规范第 10.6 节)method-body 可以是 block 或只是 ;。抽象方法、接口方法、extern 方法等用于方法体的; 不是empty-statement。与来自属性的 accessor-body 相同,例如自动属性。
【解决方案2】:

正如@JeppeStigNielsen 解释的那样:

它是 C# 规范所要求的。见第 8 章,声明。具体来说,if 语句(第 8.7.1 节)包含一个嵌入语句,而try 语句(第 8.10 节)包含一个块。嵌入语句可以是多种事物中的任何一种,其中只有一个是块(8.2)。另一个是空语句(8.3)。有关这些定义,请参见第 8 章的开头。

据我所知[文档是ifwhile 等语句。期望任何类型的嵌入式语句。这些是诸如块{ }、空语句; 等。try 语句需要一个块,而不仅仅是任何嵌入语句(见第 8 章开头)。

可以通过directly from Microsoft 下载文档,也可以在本地硬盘上找到C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\1033\(通过@JeppeStigNielsen)。

【讨论】:

  • 请注意,如果您有 Visual Studio,则该规范也在您的本地计算机上。它位于通常称为C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\1033\ 的文件夹中(12.0 对应于 VS2013)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 2019-08-02
  • 2016-11-11
  • 2023-01-31
  • 2020-08-10
相关资源
最近更新 更多