C#空语句

C#语言规范定义了空语句语法生成,它允许我做这样的事情:

static void Main(string[] args) { ; ; ; } 

为什么微软会用C#语言包含这种语法生成? 它有用吗?

 while (GetWhitespace(textStream)) ; 

我个人永远不会使用空话。 如果我出于某种奇怪的原因想要打代码高尔夫并写下类似的东西

 while(Foo(x++)) ; 

我更倾向于使用{}代替; 作为“无所作为的声明”。 我认为这更清楚。

几乎是因为历史原因。 那里没有你不能用{}做的事情。

更新:我只想到了一个可能的用例。 在调试版本中,它允许您在某个地方放置一个断点,保证您可以在中断时不会产生任何副作用。 如果断点周围的代码特别复杂,那么它可能很有用。

更新更新:我的错误错误。 这不起作用。 它只是将断点移动到下一个语句。 多么令人厌烦。

这有两个用途:

 while(DoSomething()) ; 

 void M() { if(someCondition) goto exit; // ... exit: ; } 

还有很多其他的。 它是一个有用的设备,任何时候都无需做,但需要声明。

C#从C系列inheritance了很多东西,在那里你可以做类似的事情

 for (i = 0; i < n; v[i++] = 1); 

要么

 while (testSomeCondition()); 

也就是说,运行一个空体的循环,其中“肉”在括号内。

虽然可以讨论它们的优点和危险,但这些是C编程领域中非常常见的编程习惯,因此这种向后兼容性使C / C ++ / Java程序员更容易学习C#。

它允许将代码块IFDEF输出,并且周围的代码仍然构建。 例如

 if(true){ #if(DEBUG) System.Console.WriteLine("Debug comment"); #endif } 

如果您不喜欢括号,可以将其写为空块:

 if(true) #if(DEBUG) System.Console.WriteLine("Debug comment") #endif ; 

好的做法与否,有些人使用这个:

 while (!SomeCondition) ; // <-- body of the while loop is an empty statement 

为什么微软会用C#语言包含这种语法生成?

这个问题的主要答案是:C#是类C语言,让不同开发人员的生活变得更轻松MS决定使大多数基本语法元素与其他类c语言兼容。 这很好。

这是一个假设,但我认为它适用于编译器的基本语法。 将它与设定理论联系起来,“空集”就在每一套内部。 那个; 实际上是定义一组词汇操作,总是必须定义; 这也是接受空语句的基本情况。

 if (b1) if (b2) else; else //code 

这个; 这将是痛苦的。 但这也不是写ifs的最好方法。 但可以接受。

Eric Lippert是个好人。

大多数情况下,我认为这是因为它不会造成任何伤害,并且简化了对语法的处理。 另外,为什么在不需要的时候限制人?

对于它的价值,一个好的经验法则是你应该在调试器中逐步完成你编写的每一行代码,对于每个可能的执行路径至少一次

ref: 可能错误的空语句

所以一些天才可以写for(;;)而不是while(true) 。 喜欢面试测试。

想象一下,您有一些想要通过新function扩展的代码:

 void DoSomething() { // ... NewMethod(); } 

现在你介绍一个名为NewMethod的新成员。 但是,您没有时间适当地实现它并将其留空:

 public void NewMethod() { } 

一段时间后,您最终可以实现该成员的代码,而不必费心去哪里以及如何调用它,因为之前已经完成了。

您还可以创建一个不实现的界面。 这样您只能定义要做的事情,而不是如何做。

另一种可能的情况是拥有一个通常什么也不做的virtual成员,但在少数情况下(某些特定实现),您希望该方法返回特定值。 请参阅此文章,例如: 没有正文的虚拟方法