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

在我的 C/C + + 时代,将“无限循环”编码为

while (true)

感觉更自然,对我来说更显而易见

for (;;)

上世纪80年代末与 电脑线头的一次会面以及随后关于最佳实践的讨论打破了我的这个习惯。此后,我使用 for控制语句对循环进行了编码。今天,很长一段时间以来第一次,也许是我作为一个 C # 开发人员第一次需要一个无限循环,我面临着同样的情况。其中一个是正确的,另一个不是吗?

168603 次浏览

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

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

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


}

总是我和我看到的其他人使用的循环,必须手动中断。

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

while(true) {...}

它似乎比空 for 语句更能表达意图。

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

就代码的可读性而言,while(true)在任何语言中都更有意义。就计算机如何看待它而言,在当今这个高效率的编译器和解释器的社会里,真的不应该有什么不同。

If there is any performance difference to be had I'm sure the translation to MSIL will optimise away. You could check that if you really wanted to.

我说 for(;;)的唯一原因是由于 CodeDom 的限制(而循环不能使用 CodeDom 声明,for 循环被视为更一般的迭代循环形式)。

This is a pretty loose reason to choose this other than the fact that the for loop implementation can be used both for normal code and CodeDom generated code. That is, it can be more standard.

注意,您可以使用代码片段来创建 while循环,但是整个循环需要是一个片段..。

重复几个老笑话:

  1. 不要使用“ for (;;) {}”ーー这样会让语句哭泣。
  2. 当然,除非你是“ #define EVER ;;”。

C # 编译器将对两者进行转换

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

还有

while (true)
{
// ...
}

进入

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

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

来源:

我在 .NET 反射器上做了一些修改,然后在 Visual Studio 中使用“ Optimize Code”编译了这两个循环。

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

Label_0000:
goto Label_0000;

迅猛龙应该很快就会发动攻击。

吸气,使用:

while (!false)
{


}

或者正如 见鬼指出的那样,你可能需要加倍确定:

while (!false && true)
{
}

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

就我个人而言,我一直更喜欢 for(;;),因为它有 no条件(相对于 while (true),它有一个总是真实的)。然而,这实际上是一个非常次要的风格点,我觉得不管怎样都不值得争论。我还没有看到强制或禁止任何一种方法的 C # 风格指南。

I personally prefer the for (;;) idiom (coming from a C/C++ point of view). While I agree that the while (true) is more readable in a sense (and it's what I used way back when even in C/C++), I've turned to using the for idiom because:

  • 很显眼

我认为循环没有终止(以正常的方式)这一事实值得“调出”,而且我认为 for (;;)在这方面做得更多一些。

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

虽然我很喜欢这个:

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

对于 while 循环,任何始终返回 true 的表达式都应该是 OK 的。

Example:

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

如果你想走老路子,goto 在 C # 中仍然支持:

STARTOVER:
//Do something
goto STARTOVER;

对于真正的无限循环,这是 go-to 命令。 =)

I prefer slightly more "literate" code. I'm much more likely to do something like this in practice:

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


shouldContinue = CheckSomething();
}

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

for (;;) ...

无限循环。它是明确的,易于阅读,并有一个长期和崇高的历史背后。

附录 < em > (2017年2月)

当然,如果您认为这种循环形式(或任何其他形式)过于神秘,那么您总是可以只使用 add a comment

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

或者:

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

甚至我也说下面这个更好:)

while(true)
{


}

如果你在打高尔夫球,我建议你用 for(;;)。除此之外,while(true)具有相同的含义,似乎更直观。无论如何,大多数程序员都可能理解这两种变体,所以这并不重要。用最舒服的。

两者功能相同,但人们普遍更喜欢 while(true)