哪个是正确的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代码,我查了一下:)
重温一些老笑话:
- 不要使用“
for (;;) {}
” – 它使声明哭泣。 - 当然,除非你“
#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的翻译将优化。 你可以检查一下,如果你真的想。