为什么分号而不是空块并不总是有效?

时间:2015-03-27 13:49:45

标签: c# syntax

我现在已经想了一会儿;为什么使用分号;而不是空块{}并不总是有效?它在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!

根据我的理解,总是可以使用分号而不是空块。为什么这仅限于某些陈述?使用{ };后面的语句是否存在真正的区别?

2 个答案:

答案 0 :(得分:1)

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

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

如果是catch,还需要一个代码块(用于处理异常)。创建一个空的catch块被认为是错误的编程。

答案 1 :(得分:1)

正如@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)。