c#从其他对象属性更改一个对象属性的值

时间:2016-04-15 17:41:10

标签: c# pass-by-reference pass-by-value

我正在使用来自其他对象的值创建一个对象。就像:

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属性中。任何解释和可能的解决方法?

1 个答案:

答案 0 :(得分:1)

数组是引用类型,因此当您调用

Mob m = new Mob(0,0,map);

您正在将引用传递给数组到Mob构造函数,并且您对Mob类中的数组所做的任何更改都将反映在源数组中。您可以通过以下两种方式之一进行更改:

  1. 在将数组传递给Mob类或
  2. 之前克隆该数组
  3. Mob构造函数中克隆数组。
  4. 从所有权的角度来看,问题是 - 客户期望是否应该看到数组的更改,或者数组是否更像是可以在类中修改的“种子”输入?

    另请注意,您有一个数组数组,因此您不仅需要关闭“外部”数组,而且需要关闭其中的每个数组:

    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();
    }