c#将一个对象属性的值与另一个对象属性的值进行更改
我使用其他对象的值创建一个对象。如下所示: MAP.csc#将一个对象属性的值与另一个对象属性的值进行更改,c#,pass-by-reference,pass-by-value,C#,Pass By Reference,Pass By Value,我使用其他对象的值创建一个对象。如下所示: MAP.cs int[][] map = {......}; Mob m = new Mob(0,0,map); 并调用Mob的类函数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 =
int[][] map = {......};
Mob m = new Mob(0,0,map);
并调用Mob的类函数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)中使用Dispatchermer调用函数
此应用程序的结果是更改了map类中的map属性。所做的唯一更改应该是在Mob对象的map属性中。有什么解释和可能的修复方法吗?数组是引用类型,所以当您调用
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;
}
public T[][]克隆(T[][]源)
{
T[][]输出=新的T[source.Length][];
对于(int i=0;i您是否尝试过将map
数组的副本传递给Mob
构造函数?即“种子一号”。我推断它传递了引用,但是否应该使用for循环克隆数组,或者是否有更好的方法?定义“更好”。for
循环的非常好,或者您可以使用Linq查询。
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;
}
public T[][] Clone<T>(T[][] source)
{
return source.Select(a => (T[])a.Clone()).ToArray();
}