我正在尝试创建一个临时数组
Stack<Point[]> v = new Stack<Point[]>();
Point[] c= new Point[4];
然后将其存储在堆栈中
v.Push(c);
但是每次我尝试修改数组时,它也会修改堆栈中的每个instance
。
c[state] = mouse;
是否可以将其复制到堆栈中?
答案 0 :(得分:2)
由于数组是引用类型,因此您使用相同的实例,因此每次修改数组时,它也会修改堆栈中的每个实例。
我将为Stack
而不是c
创建一个新的实例数组,它可以拆分两个数组。
Stack<Point[]> v = new Stack<Point[]>();
Point[] c = new Point[4];
v.Push(new Point[4]);
c[0] = new Point(1, 1);
如果c
Point[]
中有一些数据,则可以尝试使用CopyTo
将数据复制到另一个数组。
Stack<Point[]> v = new Stack<Point[]>();
Point[] c = new Point[4];
Point[] pushArr = new Point[c.Length];
c.CopyTo(pushArr, 0);
v.Push(pushArr);
答案 1 :(得分:1)
是的。您的堆栈仅保留对数组的引用。您必须创建阵列的副本。
Stack<Point[]> v = new Stack<Point[]>();
Point[] c = new Point[4];
v.Push(c);
c[0] = new Point(5, 5);
Point[] cc = new Point[c.Length];
Array.Copy(c, cc, c.Length);
cc[0] = cc[0];
c[0].X = 20;
c[0].Y = 20;
var cx = v.Pop();
Console.WriteLine(c[0]);
Console.WriteLine(cx[0]);
Console.WriteLine(cc[0]);
编辑:结果:
{X=20,Y=20}
{X=20,Y=20}
{X=5,Y=5}
答案 2 :(得分:0)
当你这样说时:
int[] arr1=arr2;
它不只是将一个变量的数据复制到另一个变量,而是存储一个引用。
我的问题的解决方案是:
v.Push(new Point[4]);
Point[] c = v.Last();
这里我将'c'指向堆栈的最后一个变量。
之前发生的事情是我将堆栈中的每个变量都引用为'c'。