哪个是正确的C#无限循环,for(;;)或while(true)?

回到我的C / C ++日子,编写一个“无限循环”

while (true) 

感觉更自然,而且对我来说似乎更明显

 for (;;) 

在二十世纪八十年代后期和后来的最佳实践讨论中,与PC-lint的遭遇使我忽略了这种习惯。 我已经编写了循环使用for控制语句。 今天,这是第一次,也许我第一次需要一个C#开发者的无限循环,我面临着同样的情况。 其中一个是正确的,另一个不是?

 while(true) { } 

总是我用过的,以及我看到其他人使用的必须手动打破的循环。

C#编译器将转换两者

 for(;;) { // ... } 

 while (true) { // ... } 

 { :label // ... goto label; } 

两者的CIL是相同的。 大多数人认为while(true)容易阅读和理解。 for(;;)是相当神秘的。

资源:

我使用.NET Reflector搞砸了一些,并且在Visual Studio中使用“优化代码”编译了两个循环。

两个循环都编译成(使用.NET Reflector):

 Label_0000: goto Label_0000; 

猛龙队很快就会进攻。

我认为这可能会更容易阅读,并且绝对是在C#中使用的标准:

 while(true) { //Do My Loop Stuff } 

喘气,使用:

 while (!false) { } 

或者如同jsight指出的那样,你可能想要加倍确定:

 while (!false && true) { } 

在人们叫我之前,都是一样的CIL代码,我查了一下:)

重温一些老笑话:

  1. 不要使用“ for (;;) {} ” – 它使声明哭泣。
  2. 当然,除非你“ #define EVER ;; ”。

如果你想要上学,在C#中依然支持goto:

 STARTOVER: //Do something goto STARTOVER; 

对于一个真正的无限循环来说,这是一个前往命令。 =)

我认为while (true)是更可读。

在那些我需要一个真正的无限循环的情况下,我一直使用

 while(true) {...} 

它似乎expression意图比空的陈述更好。

就我个人而言,我一直比较喜欢for(;;)因为它没有条件(而不是while (true)的,永远是真的)。 不过,这其实是一个非常小的风格点,我不认为这是值得争论的。 我还没有看到一个强制或禁止这两种方法的C#风格指南。

我个人更喜欢for (;;)成语(来自C / C ++的观点)。 虽然我同意while (true)在某种意义上更具可读性(即使是在C / C ++中也是这样的),但我转向使用for成语,因为:

  • 它脱颖而出

我认为一个循环没有终止的事实(以正常的方式)是值得“呼唤”的,我认为for (;;)做了更多的事情。

谁在乎。 这不像是你在源代码pipe理中碰到一个for(;;) ,你会用一段while(true)replace它。 争论这就像辩论支架放置。

C的原始K&R书籍,C#可以追溯其祖先,推荐

 for (;;) ... 

无限循环。 它毫不含糊,容易阅读,背后有悠久而高贵的历史。

附录 (2017年2月)

当然,如果你认为这个循环forms(或其他forms)太神秘了,你可以随时添加一个注释

 // Infinite loop for (;;) ... 

要么:

 for (;;) // Loop forever ... 

我在C ++世界里知道Stroustrup在TC ++ PL中主张(;;),但是我不记得为什么。

它应该是while(true) while(1)不是while(1) ,所以while(1)在C#中是不正确的,是的;)

我更喜欢稍微更“文学”的代码。 在实践中我更可能这样做:

 bool shouldContinue = true; while (shouldContinue) { // ... shouldContinue = CheckSomething(); } 

即使我也说下面的一个更好:)

 while(true) { } 

或者可以说有无限循环通常是不好的做法,因为它需要一个退出条件,除非应用程序真的永远运行。 但是,如果这是一个巡航导弹,我会接受一个明确的退出条件可能不需要。

虽然我喜欢这个:

 for (float f = 16777216f; f < 16777217f; f++) { } 

如果你是代码打高尔夫,我会build议for(;;) 。 除此之外, while(true)具有相同的含义,并且更直观。 无论如何,大多数编码者可能会理解这两种变化,所以这并不重要。 使用最舒适的。

我唯一的理由for(;;)是因为CodeDom的限制(while循环不能用CodeDom声明,for循环被认为是迭代循环的一般forms)。

除了for循环实现可以用于普通代码和CodeDom生成代码之外,这是一个相当宽松的原因。 也就是说,它可以更标准。

请注意,您可以使用代码片段创build一个while循环,但整个循环将需要一个片段…

他们都具有相同的function,但人们通常更喜欢while(true) 。 感觉很容易阅读和理解…

任何总是返回true的expression式对于while循环都应该是OK的。

例:

 1==1 //Just an example for the text stated before true 

就代码可读性而言while(true)无论何种语言while(true) ,我觉得更有意义。 就计算机如何看待它而言,在当今社会,编译器和口译人员真的不应该有什么不同。

如果有任何性能差异,我敢肯定,MSIL的翻译将优化。 你可以检查一下,如果你真的想。