c#将一个对象属性的值与另一个对象属性的值进行更改

c#将一个对象属性的值与另一个对象属性的值进行更改,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 =

我使用其他对象的值创建一个对象。如下所示:

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