C#控制台菜单中如何访问选项1创建的Dictionary并在选项2打印
问题根本原因
- 你的
myDictionary变量定义在选项1的分支代码块中,受C#变量作用域规则限制,只有这个代码块内部可以访问该变量,选项2的分支无法访问。 - 你用递归调用
PokemonMenu()的方式刷新菜单,每次递归调用都是独立的方法执行上下文,就算把字典定义在方法内部,每次调用也会重新生成新的字典对象,历史数据无法留存。
解决方案
把myDictionary提升为Program类的静态成员,静态成员属于类本身,所有静态方法都可以共享访问,不会随方法调用销毁。
修改后的完整代码如下:
using System; using System.Collections.Generic; using System.Linq; namespace PokemonPocket { class Program { // 将字典定义为类的静态字段,全局可访问 static Dictionary<string, string> myDictionary = new Dictionary<string, string>(); static void Main(string[] args) { //PokemonMaster list for checking pokemon evolution availability. List<PokemonMaster> pokemonMasters = new List<PokemonMaster>(){ new PokemonMaster("Pikachu", 2, "Raichu"), new PokemonMaster("Eevee", 3, "Flareon"), new PokemonMaster("Charmander", 1, "Charmeleon") }; // 建议把递归菜单改成循环,避免长时间使用出现栈溢出问题 while (true) { PokemonMenu(); } } static void PokemonMenu() { Console.WriteLine("Welcome to Pokemon Pocket App!"); Console.WriteLine("(1). Add Pokemon to my pocket"); Console.WriteLine("(2). List Pokemon(s) in my pocket"); Console.WriteLine("(3). Check if I can evolve Pokemon"); Console.WriteLine("(4). Evolve Pokemon\n"); Console.Write("Please only enter [1,2,3,4] or Q to exit:"); char menu = Convert.ToChar(Console.ReadLine()); if (menu == '1') { // 直接给静态字典加内容,不要重复new,否则会清空历史数据 myDictionary.Add("FirstName", "John"); myDictionary.Add("LastName", "Walter"); } if (menu == '2') { foreach (var v in myDictionary) Console.WriteLine(string.Format("{0}: {1}", v.Key, v.Value)); } if (menu == 'Q') { Console.WriteLine("App exited!"); Environment.Exit(0); } } } // 补充缺失的PokemonMaster类定义,否则编译会报错 class PokemonMaster { public string Name { get; set; } public int EvolveLevel { get; set; } public string EvolveTo { get; set; } public PokemonMaster(string name, int evolveLevel, string evolveTo) { Name = name; EvolveLevel = evolveLevel; EvolveTo = evolveTo; } } }
额外优化说明
- 原代码的递归调用菜单方式存在栈溢出风险,改成
while循环调用菜单更稳定,不需要每次执行完功能都递归调用PokemonMenu()。 - 选项1中不要重复实例化字典,否则每次选择1都会清空之前添加的所有数据。
内容的提问来源于stack exchange,提问作者user15982865
相关产品推荐
相关产品推荐

