You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 11:15:07