goto语句的替代选项

本文关键字:选项 语句 goto | 更新日期: 2023-09-27 18:02:30

我对c#很不熟悉(一周前开始学习),对批处理和表达式2有一点经验,我一直在做一个基于文本的游戏,试图学习更多。我一开始用的是goto语句,但根据我找到的几乎所有人的说法,goto语句是死亡和绝望的混合体,所以我想学习更干净、更少邪恶的方法来达到同样的效果。下面是我制作的一个蹩脚的示例脚本来演示我的意思:

using System;
namespace TestScript
{
class Program
{
   public static void Main(string[] args)
    {
       string ConsoleReadinator;
        string ConsoleReadinator2;
        int Go = 0;
    mainmenu:
        do
        {
            Go = 0;
            Console.Clear();
            Console.WriteLine("Main Menu:");
            Console.WriteLine("Store or something");
            ConsoleReadinator = Console.ReadLine().ToUpper();
            if (ConsoleReadinator == "STORE") { Go = 1; }
        } while (Go == 0);
      // In-game store example
        {
            Go = 0;
            do
            {
                Console.Clear();
                Console.WriteLine("In-game store I guess");
                Console.WriteLine("Stuff you can buy, etc");
                ConsoleReadinator2 = Console.ReadLine().ToUpper();
                if (ConsoleReadinator2 == "GO") { Go = 1; }
            } while (Go == 0);
            goto mainmenu;
        }
    }
  }
}

这个脚本是功能性的,但我希望避免使用goto作为回到之前的语句的方式,以便导航菜单,并可能重复回合制游戏的算法。我在c#中使用goto语句的替代方法(这基本上是我有相同的问题,除了有点模糊)中读到关于使用方法的内容,但是Greg在那里做的例子根本不适合我,以至于可能不值得尝试使那个特定的例子工作。

goto语句的替代选项

在我看来,你想要一个无限循环:

  ...
  while (true) 
  {
      do
      {
         ...
      } while (Go == 0);
      Go = 0;
      do
      {
         ...
      } while (Go == 0);
  }

您可以使用递归,以便返回并再次执行代码。为此,您可以将代码移动到一个单独的方法中,并在此方法中调用它:

class Program
{
   public static void Main(string[] args)
   {
        string ConsoleReadinator;
        string ConsoleReadinator2;
        Method(0);
   }
 
   private static void Method(int Go)
   {    
        do
        {
            ..
        } while (Go == 0);
      // In-game store example
        do
        {
           ...
        } while (Go == 0);
        Method(Go);
   }
}

或者你可以用更好的方式使用循环。让我们看一下示例,当我们希望用户输入一个整数:

   public static void Main(string[] args)
   {
       int num;
       // This loop ends only when user enters proper integer number
       do
       {
          Console.Clear();
          Console.Write("Please enter some integer number: ");
       } while(!int.TryParse(Console.ReadLine(), out num));                      
   }

这可以通过递归的其他方式实现:

   public static int EnterNumber()
   {
       Console.Clear();
       Console.Write("Please enter some integer number: ");
       // if the number is successfully parsed return number else run this method again
       return int.TryParse(Console.ReadLine(), out num) ? num : EnterNumber();
   }
   public static void Main(string[] args)
   {
       int num = EnterNumber();
   }

我们有这么多的选择(方法、循环和递归),再也没有使用GO TO的实际用例了

通常使用方法或lambda表达式。因此,您的主菜单将成为您在代码末尾再次调用的方法。

一个建议是使用像这样的切换大小写结构:

static void Main(string[] args)
{
    string ConsoleReadinator;
    string MENU_TEXT = "Main Menu:";
    string ADDITIONAL_INFO = "Store or something";
    bool endProg = false;

    ConsoleReadinator = printMenu(MENU_TEXT, ADDITIONAL_INFO);
    // as long "EXIT" is not typed
    while (!endProg)
    {
        switch (ConsoleReadinator)
        {
            case "STORE":
                // Do your Store Stuff
                // maybe change MENU_TEXT and ADDITIONAL_INFO 
                // and print a new Menu
                ConsoleReadinator = printMenu(MENU_TEXT, ADDITIONAL_INFO);
                break;
            case "GO":
                // Do your Go Stuff
                break;
            case "EXIT":
                endProg = true;   // set exit condition to true
                break;
            default:                        
                break;
        }
    }
    Console.ReadKey();
}
// one Method to use for Menu display
public static string printMenu(string menuText, string additionalInfo)
{
    Console.Clear();
    Console.WriteLine(menuText);
    Console.WriteLine(additionalInfo);
    return Console.ReadLine().ToUpper();
}