奇怪的C#行为。设置一个值会影响两个

时间:2016-03-28 19:28:51

标签: c#

这让我很难过。以下构造函数创建了一个新的Sector实例,但更改array1array2中的值会更改两者的值!

    public Sector (Vector3[] vertices)
    {
        Vector3[] array1 = vertices;
        Vector3[] array2 = vertices;

        array1 [0].X = 0;
        array2 [0].X = 1;

        Console.WriteLine (array1 [0].X);
        Console.WriteLine (array2 [0].X);
    }

两个数组的输出均为1

1
1

这是c#语言的故意部分吗?有什么替代方案?

2 个答案:

答案 0 :(得分:4)

数组是引用,因此调用array1 = vertices不会复制值,而是将它们设置为指向同一个对象。因此,您只有一个数组。

如果你想要两个,那么复制数组,例如:

Vector3[] array1 = vertices.ToArray(); //ToArray duplicates the contents as an array
Vector3[] array2 = vertices.ToArray();

答案 1 :(得分:1)

上面引用的两个数组都只是对顶点数组的引用。因此,任一数组中的更改都将导致顶点数组发生更改。

如果您希望避免此引用问题,则需要克隆顶点数组。