C#控制台开发:switch分支执行完成后如何返回主菜单
C#控制台售货机主菜单循环重显实现方法
你之前写完加储值分支操作完没法回到主菜单,本质是原来的主菜单打印代码只在程序启动时执行了一次,没有把菜单和分支逻辑放到持续运行的程序壳里。对新手最友好的实现方式是用基础while循环包裹整套菜单交互逻辑,完全不需要写复杂的跳转代码,分支操作走完循环自动回到开头重新打印菜单。
具体改造步骤
- 先定义需要持续追踪的全局状态,比如储值余额变量
decimal currentCredits = 0.00m; - 套一层
while (true)作为主程序的运行壳,只有用户选退出选项时才跳出循环 - 把原来零散的主菜单打印代码全部挪到循环体的最开头,每次循环启动都会自动重新渲染
- 接用户输入的
switch分支逻辑放在菜单打印完成后,每个分支写完对应操作逻辑直接break就行,不需要额外写重打菜单的代码
核心参考代码
// 全局状态变量定义 decimal currentCredits = 0.00m; // 主循环入口 while (true) { // 主菜单打印块 Console.WriteLine("-------------------------------"); Console.WriteLine(""); Console.WriteLine(" VENDING MACHINIES LTD"); Console.WriteLine(""); Console.WriteLine("-------------------------------"); Console.WriteLine(" Main Menu"); Console.WriteLine(""); // 动态显示当前余额,替代原来写死的0.00 Console.WriteLine($"1 - Add Credits (current credits= {currentCredits:0.00})"); Console.WriteLine("2 - Select product/s"); Console.WriteLine("3 - Exit"); // 获取用户选择 int select = int.Parse(Console.ReadLine()); switch (select) { case 1: // 已实现的加储值逻辑 Console.WriteLine("请输入要存入的金额:"); currentCredits += decimal.Parse(Console.ReadLine()); // break后循环自动回到开头重显主菜单,无需额外代码 break; case 2: // 后续可扩展选商品的逻辑 Console.WriteLine("选择商品功能待实现"); break; case 3: Console.WriteLine("程序已退出"); // 直接终止程序跳出循环 return; } }
更简便的优化路径
- 把独立的主菜单打印块抽成单独的方法,比如
ShowMainMenu(),循环里直接调用方法就行,后续修改菜单样式只需要改这一个方法里的内容,避免重复代码冗余 - 绝对不要在每个
switch分支里重复粘贴一遍主菜单的打印代码,后续修改菜单样式时要挨个查找修改,维护成本极高 - 输入获取环节换成
int.TryParse做校验,避免用户输入非数字内容时直接触发程序崩溃,属于低投入高收益的优化点 - 不推荐新手用递归调用菜单的方式实现循环返回,随着交互层级增加很容易触发栈溢出问题,基础循环的稳定性更强
内容的提问来源于stack exchange,提问作者johnowen
相关产品推荐
相关产品推荐

