-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

返されるのは、配列内のその場所にあるオブジェクトへの参照です。次に、その戻り値を変数に設定します。その変数が参照するものを変更しても、配列にはまったく影響しません。

あなたがする必要があるのは、間接参照の別の層を追加することです:

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返し、その変更を変更して、基になる配列に反映されていることを確認できますWrapperValue

于 2012-11-08T22:16:27.603 に答える
0

aとの両方arr[23, 45]が参照型 (ポインタ) です

に設定aするnew A()と、新しいオブジェクトを指すようになります。それが指すオブジェクトを実際に変更するわけではありません。

おそらく、MyClass値を削除/再初期化するメソッドを追加する必要があります)

これに似たメソッドをあなたのMyClass

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