【问题标题】:Avoid goto statement in C#避免在 C# 中使用 goto 语句
【发布时间】:2016-12-10 20:42:09
【问题描述】:

我不想使用某种 goto 语句,但我希望用户在执行默认情况时返回主菜单。如何??我知道这是一个简单的问题,但肯定有很多新手遇到过非常相似的事情。

static void buycoffee()
{
    Double price = 0;
    int x = 0;
    while (x == 0)
    {
        Console.WriteLine("Pick a coffee Size");
        Console.WriteLine("1: Small");
        Console.WriteLine("2: Medium");
        Console.WriteLine("3: Large");
        int Size = int.Parse(Console.ReadLine());
        switch (Size)
        {
            case 1:
                price += 1.20;
                break;
            case 2:
                price += 1.70;
                break;
            case 3:
                price += 2.10;
                break;
            default:
                Console.WriteLine("This option does not exist");
                ///how to return to the main menu here
                break;
        }
        Console.WriteLine("Would you like to buy more coffee?");
        String Response = Console.ReadLine().ToUpper();
        if (Response.StartsWith("Y"))
        {
            Console.Clear();
        }
        else
        {
            x += 1;
        }
    } 
Console.WriteLine("The total bill comes to £{0}", price.ToString("0.00"));
}

}

【问题讨论】:

  • 做类似do { ... } while(!userInputValid);的事情。
  • 您是否尝试过在默认 case 语句中使用 return 而不是 break
  • 在switch语句结束后,你可以添加if(price == 0) continue;这将跳转到循环的下一次迭代
  • @KMoussa 如果这个人已经买了一杯咖啡,那么这将不起作用,因为上一杯咖啡的价格将不为零。
  • 为什么在 while 条件下使用整数 (x) 而不是布尔值?

标签: c# goto


【解决方案1】:

将您的注释行替换为:continue;

【讨论】:

    【解决方案2】:

    正如 Nico Schertier 所说,您可以通过以下方式完成此操作:

    int Size = -1;
    
    while (Size == -1) {
        Console.WriteLine("Pick a coffee Size");
        Console.WriteLine("1: Small");
        Console.WriteLine("2: Medium");
        Console.WriteLine("3: Large");
        Size = int.Parse(Console.ReadLine());
        switch (Size)
        {
            case 1:
                price += 1.20;
                break;
            case 2:
                price += 1.70;
                break;
            case 3:
                price += 2.10;
                break;
            default:
                Size = -1;
                Console.WriteLine("This option does not exist");
                break;
        }
    }
    

    【讨论】:

    • 默认情况下的中断可能应该是继续允许在有效选项的情况下切换后发生额外的逻辑。
    • @RobertHickman 这个解决方案的重点是在有效选项的情况下跳出while循环。它与原始代码中的 while 循环不同。
    • 好的。因此,OP 需要将此循环包装在另一个 while 循环中以获得“更多咖啡”功能。
    • 感谢您的精彩回复。这里有这么多真的帮助我理解代码。我很肯定这会帮助像我这样的其他人。
    【解决方案3】:

    除了@Abion47 和@Dogu Arslan 的答案,您还可以为您的菜单和开关创建一个功能。

    在本例中,它将创建一个无限循环菜单

    static void Menu()
    {
        Console.WriteLine("Menu");
        Console.WriteLine("1) Take me to My fancy menu");
    }
    static void SwitchFunc(string input)
    {
        switch (input)
        {
            case "1":
                Menu();
                string inputB = Console.ReadLine();
                SwitchFunc(inputB);
                break;
        }
    }
    
    
    
    static void Main(string[] args)
    {
        Menu();
        string input = Console.ReadLine();
        SwitchFunc(input);
    
    }
    

    【讨论】:

    • @EatPeanutButter。这很酷。在内部调用函数会导致内存问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多