C#中for(;;)和while(true)的区别?从句法上讲,我看到它们无限循环直到到达break语句,但它们编译成相同的东西吗?因为它没有条件检查?除了代码可读性之外还有其他区别吗?鉴于此输入:privatestaticvoidForLoop(){intn=0;对于(;;){Console.WriteLine(n++);}}privatestaticvoidWhileLoop(){intn=0;while(true){控制台。写行(n++);}}...你得到这个输出:.methodprivatehidebysigstaticvoidForLoop()cilmanaged{//Codesize14(0xe).maxstack3.localsinit([0]int32n)IL_0000:ldc.i4.0IL_0001:stloc.0IL_0002:ldloc.0IL_0003:dupIL_0004:ldc.i4.1IL_0005:添加IL_0006:stloc.0IL_0007:调用void[mscorlib]System。.sIL_0002}//方法结束Program::ForLoop.methodprivatehidebysigstaticvoidWhileLoop()cilmanaged{//代码大小14(0xe).maxstack3.localsinit([0]int32n)IL_0000:ldc.i4.0IL_0001:stloc.0IL_0002:ldloc.0IL_0003:dupIL_0004:ldc.i4.1IL_0005:添加IL_0006:stloc.0IL_0007:调用void[mscorlib]System.Console::WriteLine(int32)IL_000c:br.sIL_0002}//方法结束Program::WhileLoop非常相似,我会说(相同,甚至)在现代编译器中,绝对不是。然而,从历史上看,for(;;)被实现为单个跳转,而while(true)也检查是否为真。我更喜欢while(true)因为它让我更清楚自己在做什么。我没有检查输出代码,但它应该没有任何区别。任何体面的编译器都会做足够简单的循环优化,以查看条件是一个常量表达式,因此不需要每次迭代都检查它。如果一个比另一个快,那么C#编译器编写者需要给他们制造一些噪音……我建议您尽可能地看一个稍微不同的问题。如果你经常使用其中任何一个,你可能很难构建你的代码。虽然嵌入式系统确实可以永远运行,但普通代码中的大多数循环却不能。编写一个声称永远运行的循环通常意味着您已经隐藏了内部循环的退出条件,并使用一些其他控制流(例如,if(whatever)break;)作为循环的实际退出。这通常应该避免。虽然在某些情况下break语句是有意义的,但它们通常应该处理异常情况,而不是编写一个说一件事又说另一件事的循环(即说“永远运行”,但实际上“运行直到满足条件”)。他们编译成同样的东西。您可以编写一个实现这两种方法的测试应用程序,然后使用ILDASM来确认它们是相同的。正如其他人所提到的,它应该与任何现代编译器完全没有区别。我在我的电脑上做了一个简短的测试,使用其中一个几次,它们总是花费大约相同的时间。当然,由于其他进程正在运行,这些测试并非100%准确,但如果速度存在差异(不应该存在差异),则这是微观测试。调试程序集符合while(true)。使用反射器,您可以看到结果。staticvoidMain(string[]args){ExecuteWhile();执行();}privatestaticvoidExecuteFor(){for(;;){Console.WriteLine("for");stringval=Console.ReadLine();if(string.IsNullOrEmpty(val)){Console.WriteLine("退出。");休息;}}}privatestaticvoidExecuteWhile(){while(true){Console.WriteLine("while");stringval=Console.ReadLine();if(string.IsNullOrEmpty(val)){Console.WriteLine("Exitwhile.");休息;}}}检查Reflector中的ExecuteFor方法。privatestaticvoidExecuteFor(){while(true){Console.WriteLine("for");if(string.IsNullOrEmpty(Console.ReadLine())){Console.WriteLine("退出。");返回;}}}相同代码的优化版本会为ExecuteFor产生不同的结果privatestaticvoidExecuteFor(){do{Console.WriteLine("for");}while(!string.IsNullOrEmpty(Console.ReadLine()));Console.WriteLine("退出。");}为了冗长,这里是优化后的ExecuteWhile...以上是C#学习教程:C#中for(;;)和while(true)的区别?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注—privatestaticvoidExecuteWhile(){do{Console.WriteLine("while");}while(!string.IsNullOrEmpty(Console.ReadLine()));Console.WriteLine("退出。");}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
