c# 更改一个对象的值 属性 来自另一个
c# changes value of one object property from other
我正在使用来自其他 object.Like 的值创建一个对象:
MAP.cs
int[][] map = {......};
Mob m = new Mob(0,0,map);
并调用 Mob 的 class 函数 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;
在另一个 class(MainWindow) 中使用 DispatcherTimer 调用函数
这个应用的结果是MAPclass中的map属性被改变了。所做的唯一更改应该是在 Mob 对象的映射 属性 中。任何解释和可能的解决方法?
数组是引用类型,所以当你调用
Mob m = new Mob(0,0,map);
您正在将数组的 引用 传递给 Mob
构造函数,以及您在 Mob
[=43] 中对数组所做的任何更改=] 将反映在源数组中。您可以通过以下两种方式之一更改此设置:
- 在将数组传递给
Mob
class 或 之前克隆数组
- 在
Mob
构造函数中克隆数组。
从所有权的角度来看,问题是 - 客户 期望 看到数组的变化,还是数组更像是一个 "seed" 输入在 class?
内修改
另请注意,您有一个数组 个数组 ,因此您不仅需要关闭 "outer" 数组,还需要关闭其中的每个数组:
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();
}
我正在使用来自其他 object.Like 的值创建一个对象:
MAP.cs
int[][] map = {......};
Mob m = new Mob(0,0,map);
并调用 Mob 的 class 函数 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;
在另一个 class(MainWindow) 中使用 DispatcherTimer 调用函数 这个应用的结果是MAPclass中的map属性被改变了。所做的唯一更改应该是在 Mob 对象的映射 属性 中。任何解释和可能的解决方法?
数组是引用类型,所以当你调用
Mob m = new Mob(0,0,map);
您正在将数组的 引用 传递给 Mob
构造函数,以及您在 Mob
[=43] 中对数组所做的任何更改=] 将反映在源数组中。您可以通过以下两种方式之一更改此设置:
- 在将数组传递给
Mob
class 或 之前克隆数组
- 在
Mob
构造函数中克隆数组。
从所有权的角度来看,问题是 - 客户 期望 看到数组的变化,还是数组更像是一个 "seed" 输入在 class?
内修改另请注意,您有一个数组 个数组 ,因此您不仅需要关闭 "outer" 数组,还需要关闭其中的每个数组:
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();
}