我正在使用来自其他对象的值创建一个对象。就像:
MAP.cs
int[][] map = {......};
Mob m = new Mob(0,0,map);
调用Mob的类函数Move()
m.Move();
移动功能如下所示:
int xp = (int)Math.Floor(x / 32);
int yp = (int)Math.Floor(y / 32);
int[] result = lookForClosest(xp, yp);
this.nextX = result[1];
this.nextY = result[0];
map[this.nextY][this.nextX] = 1;
在另一个类(MainWindow)中使用DispatcherTimer调用函数 此应用程序的结果是MAP类中的map属性已更改。唯一的更改应该是在Mob对象的map属性中。任何解释和可能的解决方法?
答案 0 :(得分:1)
数组是引用类型,因此当您调用
时Mob m = new Mob(0,0,map);
您正在将引用传递给数组到Mob
构造函数,并且您对Mob
类中的数组所做的任何更改都将反映在源数组中。您可以通过以下两种方式之一进行更改:
Mob
类或Mob
构造函数中克隆数组。从所有权的角度来看,问题是 - 客户期望是否应该看到数组的更改,或者数组是否更像是可以在类中修改的“种子”输入?
另请注意,您有一个数组数组,因此您不仅需要关闭“外部”数组,而且需要关闭其中的每个数组:
public T[][] Clone<T>(T[][] source)
{
T[][] output = new T[source.Length][];
for(int i=0; i<source.Length; i++)
output[i] = (T[])source[i].Clone();
return output;
}
或者如果你对Linq感到满意:
public T[][] Clone<T>(T[][] source)
{
return source.Select(a => (T[])a.Clone()).ToArray();
}