为什么当我将字典 <char, stack<int>> 传递给函数时(按值)生成 $ReturnValue1

Why is $ReturnValue1 being generated when i pass (by value) a dictionary<char, stack<int>> to a function

我们正在控制台中创建河内塔游戏 window。我们应该使用 Dictionary> 来保存游戏片段。我将它在 main 之外声明为全局。当我调用 static void function drawboard(Dictionary<char, Stack<int>> 时。不管我怎么尝试,一个局部变量名System.Collections.Generic.Dictionary<TKey, TValue>.this[TKey].get returned。当我观察它显示为 $ReturnValue1 的变量时,它正在覆盖我原来的字典。发生了什么,我该如何阻止它,或者至少解决它。

我已经尝试创建字典的副本并将它们传递给 drawboard,但它仍然会覆盖原始字典。我尝试过更改字典的范围,并尝试向字典添加修饰符,如受保护、私有等。我也跳过了几个环节,使我的画板比目前试图解决这个问题的画板更复杂一些。如果我能找出问题的根源,我可以很容易地简化它。

--声明--

 static Dictionary<char, Stack<int>> towers = new Dictionary<char, Stack<int>>();
            towers.Add('A', new Stack<int> { });
            for (int x = 4; x > 0; x--)
            {
                towers['A'].Push(x);
            } 
            towers.Add('B', new Stack<int> { }); 
            towers.Add('C', new Stack<int> { });

---画板功能---

static void printboard(Dictionary<char, Stack<int>> t)
    { 
        Stack<int> A = t['A'];
        Stack<int> B = t['B'];
        Stack<int> C = t['C'];


        for (int y = 0; y < 5; y++)
        {
            if (y == 4)
            {
                Console.Write("----------\n" +
                              "A   B   C\n");
            }
            else
            {
                if (A.Count == 0)
                    Console.Write("|" + "   ");
                else
                {
                    Console.Write(A.Pop() + "   ");
                }
                if (B.Count == 0)
                    Console.Write("|" + "   ");
                else
                {
                    Console.Write(B.Pop() + "   ");
                }
                if (C.Count == 0)
                    Console.Write("|" + "   ");
                else
                {
                    Console.Write(C.Pop() + "   ");
                }
                Console.Write("\n");
            }
        }
    }

代码应该按值传递字典,从字典的本地副本中弹出值并将它们打印到控制台window,而不影响原始的塔字典。

创建一个 Dictionary 类型变量并将原始字典 towers 的副本分配给它,然后将这个新变量传递给您的 printboard 方法。像这样:

var copiedTowers = new Dictionary<char, Stack<int>>(towers);
printboard(copiedTowers);

这也可以实现为:

printboard(new Dictionary<char, Stack<int>>(towers));

另外,在printboard方法中,初始化变量Stack<int> A时,按照同样的方法复制字典值的内容。像这样:

Stack<int> A = new Stack<int>(t['A']);
Stack<int> B = new Stack<int>(t['B']);
Stack<int> C = new Stack<int>(t['C']);