3

現在、テトリス アプリケーションをプログラミングしています。石に多次元整数配列を使用しています。これは、多次元パネル フィールド (int[行][列]) での位置を表します。

石が下に移動したときに、フィールドの色を更新したいところです。すべてのフィールドとすべてのテトリス ストーンをループする代わりに、現在のストーンを更新したいので、最後の位置に変数を追加しました。しかし、この変数を設定すると問題が発生します。

私の質問は、なぜこれが機能するのかということです:

public void moveDown()
{
    for (int i = 0; i < location.Length; i++)
    {
        last_location[i][0] = location[i][0];
        last_location[i][1] = location[i][1];
        location[i][0] += 1;
    }
}

しかし、これはしません:

public void moveDown()
{
    last_location = location;
    for (int i = 0; i < location.Length; i++)
    {
        location[i][0] += 1;
    }
    //last_location got also updated??
}

ここでの問題は、ループの後、last_location が location 変数とまったく同じ値を持ち、後で変更されることです! なんで?前もって感謝します!

4

3 に答える 3

4

配列は参照型です。

last_location = location;そのため、を記述するときに、配列のコピーを作成しませんlast_locationよりも配列の同じインスタンスを使用しますlocation

したがって、2 つの変数のいずれかを変更すると、同じ一意のインスタンスがメモリ内で変更されます。

于 2013-04-23T11:42:36.660 に答える
1

2 番目の例では参照を割り当てますが、最初の例では値を割り当てます。

last_location = location;を実行すると、変数last_locationに自分の場所へのポインターを割り当てるため、場所の値を変更すると、 last_location が場所を指しているため、これらの値も変更されているように見えます。単一のメモリ パーティション上のlast_locationlocationポイントの両方。

最初のケースlast_location[i][0] = location[i][0]では、参照ではなくループで値を割り当てるため、last_locationlocationは異なる値を持つ異なるメモリ パーティションを指します。

于 2013-04-23T11:42:43.410 に答える
1

last_locationによって参照されるオブジェクトに代入するとlocation

last_location = location;

次に、同じオブジェクトへの 2 つの参照があります。によって参照されていたオブジェクトは参照されlast_locationなくなり、やがてガベージ コレクションが行われます。


目的を達成する最も簡単な方法はlast_location、 と同じ次元に初期化し、locationを使用することBuffer.BlockCopyです。

例えば、

var location = new []
    {
        new int[10],
        new int[10]
    };

var last_location = new []
    {
        new int[10],
        new int[10]
    };

Buffer.BlockCopy(location, 0, last_location, 0, location.Length * sizeof(int));
于 2013-04-23T11:44:33.330 に答える