首页 > 解决方案 > 如何重构此开关以消除 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;
                    }
            }
        }

标签: c#switch-statementrefactoringgoto

解决方案


//OneOne:
var haveValidAnswer = false;
while (! haveValidAnswer)
{
   Console.ReadKey();
  
   ... // as before, but with control of haveValidAnswer 

}

你应该学会在没有gotos 的情况下设计控制流。一个问题是goto逻辑通常很容易编写,但很难阅读和维护。


推荐阅读