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

当你得到一个结构时,它总是按值。该结构将被复制,您不会获得对它的引用。

不同的是,您可以直接在数组中访问 sstruct,但不能在列表中访问。当您更改数组中结构中的属性时,您可以直接访问该属性,但要对列表执行相同操作,您必须获取结构,设置属性,然后将结构存储回列表中:

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

早期版本的编译器可以让你编写你拥有的代码,但是对于一个列表,它会生成类似于这样的代码:

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

即它会读取结构,改变它,然后默默地把改变的结构扔掉。在这种情况下,编译器已更改为给出错误。

于 2012-12-05T20:57:09.720 回答