c# - 如何重构此开关以消除 GOTO?
问题描述
我是 C# 新手,正在制作基于文本的游戏。完成后,我了解到 goto 是撒旦的产物(pffft)。我在这个脚本中有很多实例,我问玩家一个是或否的问题,如果玩家输入其他任何内容,他们会收到一条错误消息,然后我使用 goto 和标签循环回到开关的开头。所以给出下面的例子,有什么方法可以在不使用 goto 的情况下重新编写此代码以产生相同的结果?谢谢!
public static void One()
{
string response;
Console.BackgroundColor = ConsoleColor.Red;
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Clear();
Console.WriteLine("Some text.");
OneOne:
Console.ReadKey();
Console.Write("\nA question?");
response = Console.ReadLine().ToLower();
Console.Clear();
switch (YesOrNoDetector.Detect(response))
{
case YesOrNo.Yes:
{
Console.WriteLine("A response!");
Console.ReadKey();
Two();
break;
}
case YesOrNo.No:
{
Console.WriteLine("A different response.");
Console.ReadKey();
Three();
break;
}
case YesOrNo.Undefined:
{
Console.WriteLine("Refresh switch to look for a yes/no answer");
goto OneOne;
}
}
}
解决方案
//OneOne:
var haveValidAnswer = false;
while (! haveValidAnswer)
{
Console.ReadKey();
... // as before, but with control of haveValidAnswer
}
你应该学会在没有goto
s 的情况下设计控制流。一个问题是goto
逻辑通常很容易编写,但很难阅读和维护。
推荐阅读
- node.js - MongoDb 重复密钥错误
- java - 如何使用 selenium java 上传文件
- python - 对于大小为 795 的轴 0,索引 795 超出范围
- linux - 我可以从哪里开始进入网络和黑客领域的旅程?
- sql - 大型 SQL“IN”子句和数百万行的快速结果
- websocket - 向服务器发送数据时出现 Python Flask Socketio BadNamespaceError
- mysql - MySQL查询没有给我平均的,饱和的未知列
- android - Android Kotlin 协程在使用变量打开的片段上创建 RecyclerView
- python - on_member_join 和删除不起作用。如何让它发挥作用?
- android - Mono.AndroidTools.AdbException:尝试读取流的末尾(在 Visual Studio 上)