回到我的 C/C++ 时代,将“无限循环”编码为
while (true)
感觉更自然,对我来说似乎更明显,而不是
for (;;)
在 1980 年代后期与PC-lint的相遇以及随后的最佳实践讨论打破了我的这种习惯。我已经使用for
控制语句对循环进行了编码。今天,很长一段时间以来第一次,也许是我作为 C# 开发人员第一次需要无限循环,我面临着同样的情况。其中一个正确而另一个不正确吗?
回到我的 C/C++ 时代,将“无限循环”编码为
while (true)
感觉更自然,对我来说似乎更明显,而不是
for (;;)
在 1980 年代后期与PC-lint的相遇以及随后的最佳实践讨论打破了我的这种习惯。我已经使用for
控制语句对循环进行了编码。今天,很长一段时间以来第一次,也许是我作为 C# 开发人员第一次需要无限循环,我面临着同样的情况。其中一个正确而另一个不正确吗?
C# 编译器将转换两者
for(;;)
{
// ...
}
和
while (true)
{
// ...
}
进入
{
:label
// ...
goto label;
}
两者的 CIL 相同。大多数人发现while(true)
更容易阅读和理解。for(;;)
是相当神秘的。
我在.NET Reflector上搞砸了一些,我在 Visual Studio 中使用“优化代码”编译了两个循环。
两个循环都编译成(使用 .NET Reflector):
Label_0000:
goto Label_0000;
while(true)
{
}
始终是我使用过的以及我看到其他人使用的必须手动破坏的循环。
我认为这可能更容易阅读,并且绝对是 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) {...}
它似乎比空的 for 语句更能表达意图。
就个人而言,我一直更喜欢for(;;)
它,因为它没有条件(相对于while (true)
它有一个永远为真的条件)。然而,这确实是一个非常次要的风格点,我觉得这两种方式都不值得争论。我还没有看到强制或禁止任何一种方法的 C# 样式指南。
C的原始K&R书籍,C# 可以从中追溯它的祖先,推荐
for (;;) ...
对于无限循环。它毫不含糊,易于阅读,背后有着悠久而崇高的历史。
附录 (2017 年 2 月)
当然,如果您认为这种循环形式(或任何其他形式)过于神秘,您可以随时添加评论。
// Infinite loop
for (;;)
...
或者:
for (;;) // Loop forever
...
我个人更喜欢这个for (;;)
成语(从 C/C++ 的角度来看)。虽然我同意它while (true)
在某种意义上更具可读性(即使在 C/C++ 中也是我使用的方式),但我已经转向使用该for
成语,因为:
我认为循环不会终止(以正常方式)这一事实值得“大声疾呼”,而且我认为这样for (;;)
做更多。
它应该while(true)
不是while(1)
,所以while(1)
在 C# 中是不正确的,是的;)
或者,可以说拥有无限循环通常是不好的做法,因为它需要退出条件,除非应用程序真的永远运行。但是,如果这是用于巡航导弹,我将接受可能不需要明确的退出条件。
虽然我喜欢这个:
for (float f = 16777216f; f < 16777217f; f++) { }
我更喜欢“有文化”的代码。在实践中,我更有可能做这样的事情:
bool shouldContinue = true;
while (shouldContinue)
{
// ...
shouldContinue = CheckSomething();
}
即使我也说下面的更好:)
while(true)
{
}
while(true)
就我认为更有意义的任何语言的代码可读性而言。就计算机如何看待它而言,在当今非常高效的编译器和解释器的社会中确实不应该有任何区别。
如果有任何性能差异,我确信转换为 MSIL 会优化掉。如果你真的想要,你可以检查一下。
我要说的唯一原因for(;;)
是由于 CodeDom 的限制(不能使用 CodeDom 声明 while 循环,而 for 循环被视为迭代循环的更一般形式)。
for
除了循环实现既可用于普通代码也可用于 CodeDom 生成的代码这一事实之外,这是选择它的一个非常宽松的理由。也就是说,它可以更标准。
请注意,您可以使用代码片段来创建while
循环,但整个循环需要是一个片段......
如果你在打代码,我建议for(;;)
. 除此之外,while(true)
具有相同的含义并且看起来更直观。无论如何,大多数编码人员可能会理解这两种变化,所以这并不重要。使用最舒适的。
两者功能相同,但人们普遍偏爱while(true)
. 感觉很容易阅读和理解...
对于 while 循环,任何始终返回 true 的表达式都应该是可以的。
例子:
1==1 //Just an example for the text stated before
true