回到我的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)
Ada*_*son 121
while(true)
{
}
Run Code Online (Sandbox Code Playgroud)
总是我用过的东西,以及我见过别人用来做一个必须手动打破的循环.
RSo*_*erg 60
我认为这可能更容易阅读,绝对是C#中使用的标准:
while(true)
{
//Do My Loop Stuff
}
Run Code Online (Sandbox Code Playgroud)
All*_*ice 45
喘气,使用:
while (!false)
{
}
Run Code Online (Sandbox Code Playgroud)
或者正如jsight指出的那样,你可能想要倍加肯定:
while (!false && true)
{
}
Run Code Online (Sandbox Code Playgroud)
在人们对我大吼之前,它都是相同的CIL代码,我检查:)
Ben*_*ank 37
重复一些旧的笑话:
for (;;) {}" - 它使声明哭泣.#define EVER ;;".Joh*_*nFx 26
如果你想上老学,C#仍支持goto:
STARTOVER:
//Do something
goto STARTOVER;
Run Code Online (Sandbox Code Playgroud)
对于一个真正无限循环,这是首选命令.=)
Mic*_*tta 10
在我需要一个真正的无限循环的情况下,我总是使用
while(true) {...}
Run Code Online (Sandbox Code Playgroud)
它似乎表达的意图比空的声明更好.
Pav*_*aev 10
就我个人而言,我总是更喜欢for(;;)它,因为它没有条件(相反,while (true)它总是有一个条件).然而,这真的是一个非常小的风格点,我觉得不值得争论任何一种方式.我还没有看到强制或禁止任何一种方法的C#风格指南.
我个人更喜欢这个for (;;)成语(来自C/C++的观点).虽然我同意它while (true)在某种意义上更具可读性(而且即使在C/C++中也是我用过的),但我转向使用这个for成语,因为:
我认为循环不会终止(以正常方式)的事实值得'呼出',我认为这样for (;;)做会更多.
推荐使用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)