我一直在想这个问题。为什么使用分号;而不是空块{}并不总是有效?它使用像语句时,它的工作原理while,for,if,else等,但它没有工作try,catch,finally和delegate(可能是不太有用留出空白)。
所以做这样的事情是有效的:
while(shouldIWait()); // This is normal
try {
doThing(); // Might throw an exception
} catch { } // Ignore the exception
Run Code Online (Sandbox Code Playgroud)
但这不会:
try {
doThing(); // Might throw an exception
} catch; // Syntax error!
Run Code Online (Sandbox Code Playgroud)
根据我的理解,始终可以使用分号代替空块。为什么这仅限于某些陈述?语句的使用{ }和;后面的语句之间有真正的区别吗?
正如@JeppeStigNielsen 所解释的:
这是 C# 规范所要求的。请参阅第 8 章“声明”。具体来说,
if语句(第 8.7.1 节)包含嵌入语句,而try语句(第 8.10 节)包含块。嵌入语句可以是多种事物中的任何一种,其中只有一个是块(8.2)。另一个是空语句(8.3)。有关这些定义,请参阅第 8 章开头。
据我所知,[文档是诸如 等之类的语句if。while期望任何类型的嵌入语句。这些是诸如块{ }、空语句;等之类的东西try。语句需要一个块,而不仅仅是任何嵌入的语句(参见第 8 章的开头)。
该文档可以直接从 Microsoft下载,也可以在本地硬盘上找到C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\1033\(通过 @JeppeStigNielsen)。