我无法弄清楚如何打破包含switch语句的循环.断开了开关,而不是循环.
对此可能有更优雅的解决方案.我已经实现了一个标志,该标志以true开头并设置为false并结束循环.你能提供更好的解决方案吗?
背景:此代码用于条形码工作流程系统.我们有内置条形码扫描仪的PocketPC.此代码用于其中一个功能.它会在整个例程中提示用户输入不同的数据.这件作品允许他们滚动显示在PocketPC终端上显示该信息的一些库存记录(分页结果)并允许他们输入"D"表示完成,"Q"表示退出.
这是当前需要改进的C#示例:
do { switch (MLTWatcherTCPIP.Get().ToUpper()) { case "": //scroll/display next inventory location MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextDown(); break; case "P": //scroll/display previous inventory location MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextDown(); break; case "D": //DONE (exit out of this Do Loop) // break; // this breaks out of the switch, not the loop // return; // this exists entire method; not what I'm after keepOnLooping = false; break; case "Q": //QUIT (exit out to main menu) return; default: break; } } while (keepOnLooping);
这是在VB.NET中执行此操作的代码示例
Do Select Case MLTWatcherTCPIP.Get().ToUpper Case "" ''#scroll/display next inventory location MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextDown() Case "P" ''#scroll/display previous inventory location MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextUp() Case "D" ''#DONE (exit out of this Do Loop) Exit Do Case "Q" ''#QUIT (exit out to main menu) Return End Select Loop
谢谢,
我试着避免它,但你可以使用......
去然而,如果您选择这样做,那些带干草叉的愤怒小怪会成为职业危害.
我发现这种形式更具可读性:
bool done = false; while (!done) { switch (MLTWatcherTCPIP.Get().ToUpper()) { case "": //scroll/display next inventory location MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextDown(); break; case "P": //scroll/display previous inventory location MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextDown(); break; case "D": //DONE (exit out of this Do Loop) done = true; break; case "Q": //QUIT (exit out to main menu) return; default: break; } }
这里的一个选择是将此循环重构为方法("提取方法"),并使用return
.
我所知道的另一种方式是可怕的转到. MSDN也说过这个.
但是,我认为没有理由在这种情况下使用它.您实现的方式工作正常,并且比goto更易于维护.我会保留你拥有的东西.
您必须使用goto语句进行多级中断.它似乎是C#中唯一"干净"的方式.使用标志也很有用,但如果循环有其他运行困境,则需要额外的代码.
http://msdn.microsoft.com/en-us/library/aa664756(VS.71).aspx
值得注意的是,其他一些非c语言也有多层次的中断(Java虽然无用,因为它使用goto伪装成一个继续......:P)break levels;
为什么不将开关包装成一个返回布尔值以保持循环的方法?这样可以使代码更具可读性.有人写了一篇论文,说我们毕竟不需要goto语句;)
do { bool keepOnLooping = TryToKeepLooping(); } while (keepOnLooping); private bool TryToKeepLooping() { switch (MLTWatcherTCPIP.Get().ToUpper()) { case "": //scroll/display next inventory location MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextDown(); break; case "P": //scroll/display previous inventory location MLTWatcherTCPIP.TerminalPrompt.ScrollBodyTextDown(); break; case "D": //DONE (exit out of this Do Loop) // break; // this breaks out of the switch, not the loop // return; // this exists entire method; not what I'm after return false; case "Q": //QUIT (exit out to main menu) return true; default: break; } return true; }