4

次のコードでは、構造体は配列とリストから取得されます。アイテムをインデックスで取得する場合、配列は参照でそれを行うように見えますが、リストは値でそれを行うように見えます。誰かがこれの背後にある理由を説明できますか?

struct FloatPoint {
    public FloatPoint (float x, float y, float z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
    public float x, y, z;
}

class Test {

    public static int Main (string[] args) {
        FloatPoint[] points1 = { new FloatPoint(1, 2, 3) };

        var points2 = new System.Collections.Generic.List<FloatPoint>();
        points2.Add(new FloatPoint(1, 2, 3));

        points1[0].x = 0; // not an error
        points2[0].x = 0; // compile error

        return 0;
    }
}

構造体定義をクラスに変更すると、両方がコンパイルされます。

4

1 に答える 1

6

構造体を取得するとき、それは常に値によるものです。構造がコピーされますが、参照は取得されません。

違いは、配列では直接sctructにアクセスできますが、リストではアクセスできないことです。配列内の構造体のプロパティを変更すると、プロパティに直接アクセスしますが、リストで同じことを行うには、構造体を取得し、プロパティを設定してから、構造体をリストに格納する必要があります。

FloatPoint f = points2[0];
f.x = 0;
points2[0] = f;

以前のバージョンのコンパイラでは、使用しているコードを記述できますが、リストの場合は、次のようなコードが生成されます。

FloatPoint f = points2[0];
f.x = 0;

つまり、構造体を読み取り、変更し、変更された構造体を黙って破棄します。その場合にエラーが発生するようにコンパイラが変更されました。

于 2012-12-05T20:57:09.720 に答える