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] 中对数组所做的任何更改=] 将反映在源数组中。您可以通过以下两种方式之一更改此设置:

  1. 在将数组传递给 Mob class 或
  2. 之前克隆数组
  3. 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();
}