我如何重新设计此代码以避免转到?

How do I redesign this code to avoid goto?

嗯,我遇到这个问题是因为我开始使用 C# 并编写了一个控制台计算器,但是我在其中使用了 goto 并且听说不能使用它,但我不知道还有什么使它按照我想要的方式工作的说明。我把我的代码(不长)贴在这里,所以也许你可以看看它并给我一些提示。谢谢!

base:
        Console.WriteLine("First number");
        double first = double.Parse(Console.ReadLine());
        Console.WriteLine("Second number");
        double second = double.Parse(Console.ReadLine());

        Console.WriteLine("What operation do you want to perform? \n1 - addition \n2 - subtraction \n3 - multiplication \n4 - division");
        string choice = Console.ReadLine();
        if (choice == "1")
        {
            Console.WriteLine(first + second);
            Console.ReadLine();
        }
        if (choice == "2")
        {
            Console.WriteLine(first - second);
            Console.ReadLine();
        }
        if (choice == "3")
        {
            Console.WriteLine(first * second);
            Console.ReadLine();
        }

        else if (choice == "4" && second == 0)
        {             
            Console.WriteLine(" Do not divide by zero");                
        }
        if (choice == "4")
        {
            Console.WriteLine(first / second);
            Console.ReadLine();
        }

        Console.WriteLine("Next one? \n1 - Yes \n2 - No");
        string chc2 = Console.ReadLine();
        if (chc2 == "1")
        {
            goto base;
        }
        if  (chc2 == "2")
        {
            Console.WriteLine("Bye bye");
            Console.ReadKey();                

        }

使用循环。这是一种常见的方式:

while (true) {
    // do some stuff
    Console.WriteLine("Next one? \n1 - Yes \n2 - No");
    string chc2 = Console.ReadLine();
    if (chc2 == "1")
    {
        continue; // means go back to the top of the loop
    }
    if  (chc2 == "2")
    {
        Console.WriteLine("Bye bye");
        Console.ReadKey();                
        break; // means break out of the loop
    }
}

这是您重构的代码和改进的用户体验:

  string userInput;
  do
  {
    Console.WriteLine("Enter first number:");
    double operandFirst = double.Parse(Console.ReadLine());
    Console.WriteLine("Enter second number:");
    double operandSecond = double.Parse(Console.ReadLine());
    double? result = null;
    bool isValid = true;
    do
    {
      Console.WriteLine();
      Console.WriteLine("Select the operation you want to perform:");
      Console.WriteLine("1 - Addition");
      Console.WriteLine("2 - Subtraction");
      Console.WriteLine("3 - Multiplication");
      Console.WriteLine("4 - Division");
      userInput = Console.ReadLine();
      switch ( userInput )
      {
        case "1":
          result = operandFirst + operandSecond;
          break;
        case "2":
          result = operandFirst - operandSecond;
          break;
        case "3":
          result = operandFirst * operandSecond;
          break;
        case "4":
          if ( operandSecond == 0 )
            Console.WriteLine("Can't divide by zero.");
          else
            result = operandFirst / operandSecond;
          break;
        default:
          Console.WriteLine("Unknown selected operation.");
          isValid = false;
          break;
      }
    }
    while ( !isValid );
    if ( result.HasValue )
      Console.WriteLine("Result = " + result);
    Console.WriteLine();
    Console.WriteLine("Retry?");
    Console.WriteLine("1 - Yes");
    Console.WriteLine("2 - No");
    userInput = Console.ReadLine();
    Console.WriteLine();
  }
  while ( userInput != "2" );
  Console.WriteLine("Bye bye.");
  Console.WriteLine("Press a key to exit.");
  Console.ReadKey();