-1

我需要更改从 GetCell 方法获得的数组单元对象。当我尝试更改接收到的对象时,它不会更改原始对象。

这是它在代码中的样子:

// this is in MyClass
A[,] arr = new A[100,500];

// this is in main class
MyClass GetAAt(Point p) { return myClass.arr[p.X,p.Y]; }
var a = GetAAt(new Point(23,45));
a = new A(); // this only changes the local `a` but not the arr[23,45]

我在这里做错了什么?

4

4 回答 4

3

您没有更改收到的对象。
相反,您将一个用于保存接收到的对象的变量更改为保存一个全新的对象。

于 2012-11-08T22:08:15.910 回答
1

您正在将新实例分配给变量 a。您可以为您的班级添加一个新方法

void SetAAt(Point p, A a) 
{ 
    arr[p.X,p.Y] = a; 
}

并这样称呼它:

Point p = new Point(23,45);
var a = new A();
SetAAt(p, a);

PS您不应该将您的数组命名为与班级相同的名称。虽然有可能,但我认为这不是一个好习惯。

于 2012-11-08T22:14:11.773 回答
0

a和都是arr[23, 45]引用类型(指针)

设置anew A()仅使它指向一个新对象。它实际上并没有改变它指向的对象。

您可能必须添加一个MyClass删除/重新初始化值的方法)

尝试将类似于此的方法添加到您的MyClass

public void ResetAAt(int i, int j)
{
    arr[i, j] = new A();
}
于 2012-11-08T22:08:36.437 回答
0

返回的是对数组中该位置的对象的引用。然后将该返回值设置为一个变量。更改该变量引用的内容不会以任何方式影响数组。

您需要做的是添加另一层间接:

public class Wrapper
{
    private A[,] array;
    private Point position;

    public Wrapper(A[,] array, Point position)
    {
        this.array = array;
        this.position = position;
    }

    public A Value
    {
        get
        {
            return array[position.X, position.Y];
        }
        set
        {
            array[position.X, position.Y] = value;
        }
    }
}

这将允许您在 中创建一个包装器GetAAt,将其返回,并Wrapper对其Value进行更改,并能够看到它反映在底层数组中。

于 2012-11-08T22:16:27.603 回答