为什么有些行在C#中没有分号?

我只是想弄清楚为什么在下面的一些行不以分号结束但其他行做的技术原因 – 它是什么关于C#在某些行中预期的分号呢?

事实上,在写这篇文章的时候,我注意到必须有大括号{}的语句不需要分号,但是它们自己的“Console.WriteLine”中的行确实需要它。

真的试图找到这个的技术原因……

即:

namespace checkPackage **//no semicolon** { class Program **//no semicolon** { static void Main(string[] args) **//no semicolon** { listFilesInDirectory(@"C:\Temp\"); **//NEEDS a semicolon** } static void listFilesInDirectory(string workingDirectory) **//no semicolon** { string[] filePaths = Directory.GetFiles(workingDirectory); **//NEEDS a semicolon** foreach (string filePath in filePaths) **//no semicolon** { Console.WriteLine(filePath); **//NEEDS a semicolon** } } } } 

分号不是终止符……它是一个语句终止符。 每个表达式语句和声明语句的末尾都有一个分号。

iffor etc语句不是表达式或声明语句。)

例如:

 public class Foo // Part of a class declaration { int x = 0; // Declaration statement public void Bar() // Part of a method declaration { Console.WriteLine(x); // Expression statement (using an invocation expression) } // End of the method declaration, but not a declaration statement } // End of class declaration, but not a declaration statement 

要求它们的目的是让编译器能够告诉您何时结束语句而不是继续下一行:

  int x = 5; int y = x // This isn't the end of the statement! + 5; // This is... 

一种替代方法(例如,VB使用)是有一个行继续,你想明确地继续到下一行,即使当前行是一个有效的语句。

正如评论中所指出的, do语句在这里是一个exception现象。 我没有看到为什么这不应该有效的明显原因:

 do { } while (false) 

……但事实并非如此。 这可能与plain while语句需要语句体这一事实有关,例如while (true); (空语句)或while (true) {} (块语句)。 我最接近的是“因为C#规范说do语句最后需要一个分号……”

原因? 因为规范如此说:

语句可以包含以分号结尾的单行代码,也可以由块中的一系列单行语句组成。 语句块包含在{}括号中,可以包含嵌套块。

foreach定义后跟一个语句,该语句必须括在{}中或以分号结尾。 然后将此语句称为循环体。

这可能不是“为什么”这个问题的充分答案。 要深入了解这一点,你真的需要问设计师。 我想,他们希望使它接近C语法,而不是其他语言,其中换行符用于类似目的。 (Python iirc)

如果您想要更正式的定义,请下载C#语言规范并阅读1.2至1.5节。

有两种语句 , 简单语句复合语句 。 循环和方法声明是复合语句。 每个简单语句以分号结尾,但复合语句不以分号结尾。 来自msdn

复合语句由大括号({})括起来的零个或多个语句组成。 复合语句可以在预期语句的任何位置使用。 复合语句通常称为“块”。

花括号指定复合语句的开头和结尾。所以编译器查找大括号而不是分号来确定语句的开头和结尾。