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

Bob*_*man 94 c# infinite-loop

回到我的C/C++时代,将"无限循环"编码为

while (true)
Run Code Online (Sandbox Code Playgroud)

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

for (;;)
Run Code Online (Sandbox Code Playgroud)

在1980年代后期与PC-lint的相遇以及随后的最佳实践讨论让我想起了这种习惯.我已经使用for控制语句对循环进行了编码.今天,很长一段时间以来,也许我第一次需要作为C#开发人员的无限循环,我面临同样的情况.其中一个是正确的而另一个不是吗?

Pie*_*ant 304

C#编译器将转换它们

for(;;)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

while (true)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

{
    :label
    // ...
    goto label;
}
Run Code Online (Sandbox Code Playgroud)

两者的CIL是相同的.大多数人发现while(true)更容易阅读和理解.for(;;)相当神秘.

资源:

我用.NET Reflector搞砸了一点,我用Visual Studio中的"优化代码"编译了两个循环.

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

Label_0000:
    goto Label_0000;
Run Code Online (Sandbox Code Playgroud)

猛龙队应该很快就会进攻.

  • xkcd参考的+1 (62认同)
  • 很明显`goto LOOP`是正确的C#无限循环:) (25认同)
  • 是的,只是双重检查,其所有相同的IL代码,这应该是接受的答案IMO :) (7认同)
  • 为了迂腐,编译器确实*不*将一个语句形式转换为另一个语句形式; 相反,它为两个语句生成相同的代码.该代码与`goto`语句相同,顺便说一下,这并不奇怪. (4认同)
  • @Dustin:过早的优化......你知道其余的:P (2认同)

Ada*_*son 121

while(true)
{

}
Run Code Online (Sandbox Code Playgroud)

总是我用过的东西,以及我见过别人用来做一个必须手动打破的循环.

  • 不幸的是,这个答案没有回答这个问题.正确答案是"两者都是正确的". (2认同)
  • @Loadmaster:这取决于您对“正确”的定义(或者,您所追求的是哪种“正确性”)。 (2认同)

RSo*_*erg 60

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

while(true)
{
   //Do My Loop Stuff
}
Run Code Online (Sandbox Code Playgroud)

  • @voyager:1不能代替C#中的'true'. (19认同)
  • 请注意,虽然(1)无效C#:常量1无法转换为bool (17认同)
  • `while(1)`在C#中无效,因为`1`不是`bool`. (4认同)

All*_*ice 45

喘气,使用:

while (!false)
{

}
Run Code Online (Sandbox Code Playgroud)

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

while (!false && true)
{
}
Run Code Online (Sandbox Code Playgroud)

在人们对我大吼之前,它都是相同的CIL代码,我检查:)

  • 有史以来最好的答案。 (2认同)

Ben*_*ank 37

重复一些旧的笑话:

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

  • 或者`#define ever(;;)`我觉得它更具可读性.`永远{}` (23认同)
  • 甚至更好:`#define forever(true)`;) (6认同)
  • 啊。我在 OS X 上用 C 编程。我不知道 C# 预处理器被如此阉割。我什至不知道我是如何开始阅读这个问题的,我将 C# 作为被忽略的标签...... (2认同)

Joh*_*nFx 26

如果你想上老学,C#仍支持goto:

STARTOVER:  
    //Do something
    goto STARTOVER;
Run Code Online (Sandbox Code Playgroud)

对于一个真正无限循环,这是首选命令.=)

  • http://xkcd.com/292/ (9认同)
  • 我将这个从负面评级回归到零,但仅仅是因为它的幽默价值.嘿,所有循环都被编译成JMP汇编程序操作码,对吧? (6认同)
  • @serhio:更重要的是,避免在阅读某处内容时失控语言构造。没有语言元素本身就是坏的,只能以坏的方式使用。 (2认同)
  • @serhio:我已经看到几乎每一个可能的关键词都在反自然。它不是语言元素,而是程序员。无论如何,正如我之前的评论中所指出的那样,我并不赞同。我只是为了完整性和幽默感而包括了它。 (2认同)

Mar*_*oft 21

我认为while (true)更具可读性.


Mic*_*tta 10

在我需要一个真正的无限循环的情况下,我总是使用

while(true) {...}
Run Code Online (Sandbox Code Playgroud)

它似乎表达的意图比空的声明更好.


Pav*_*aev 10

就我个人而言,我总是更喜欢for(;;)它,因为它没有条件(相反,while (true)它总是有一个条件).然而,这真的是一个非常小的风格点,我觉得不值得争论任何一种方式.我还没有看到强制或禁止任何一种方法的C#风格指南.

  • @serhio:请解释一下“编译器在...时间内转换...”的含义。就程序员而言,编译器将高级代码转换为IL。IL中没有“ while”(或“ for”)循环,只有标签和gotos。 (3认同)
  • 他的回答可以更好地改写为"编译器为两者生成相同的IL"(你不知道它是否以及何时转换AST级别的任何内容,并且它在任何情况下都是实现细节).无论如何,这并不能解释为什么它"在.NET中不值得".C++,Java也是如此...... (3认同)

Mic*_*urr 6

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

  • 它脱颖而出

我认为循环不会终止(以正常方式)的事实值得'呼出',我认为这样for (;;)做会更多.

  • @serhio:不是.它不会*从*for`转换为`while`.对于`for(;;){}`和`while(true){}`,它生成新的`while(true){}`代码.请参阅[此答案](http://stackoverflow.com/a/1401208/732016). (3认同)

Dav*_*ble 6

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

for (;;) ...
Run Code Online (Sandbox Code Playgroud)

无限循环.它毫不含糊,易于阅读,并且背后有着悠久而高尚的历史.

附录 (2017年2月)

当然,如果您认为这种循环形式(或任何其他形式)过于神秘,您可以随时添加注释.

// Infinite loop
for (;;)
    ...
Run Code Online (Sandbox Code Playgroud)

要么:

for (;;)    // Loop forever
    ...
Run Code Online (Sandbox Code Playgroud)

  • 8年后,您决定更新您的答案.尼斯 (4认同)

JRL*_*JRL 5

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