在保留备份副本的同时更改阵列

时间:2015-07-02 05:07:48

标签: c#

我有一个包含3个整数的数组。我想复制数组并更改第一个整数。出于一些神奇的原因,BOTH数组得到了他们的第一个整数调整。我不知道为什么会这样,这让我发疯。

int [] numbers1 = {1, 2, 3}
int [] numbers2 = {3, 4, 5}

numbers2 = numbers1;

此时我做了一个System.Console.Writeline,看到两个数组现在都是{1,2,3}。到目前为止一切都很好。

numbers1[0] = 4;

当我做System.Console.Writeline时,我看到BOTH数组现在看起来像{4,2,3}。我希望numbers2保持不变。

5 个答案:

答案 0 :(得分:2)

目前您只传递参考资料。数组中的数字存储在内存中。当您在内存中引用对象时,它指向该对象。它在引用时不会在内存中创建新对象,因此您需要将int克隆到另一个数组中,以便它指向内存中的不同对象。

         numbers2 = numbers1; 

您需要克隆阵列。

        numbers2 = (int[])numbers1.Clone();

正如其他人所说,你也可以使用.ToArray()方法。这将创建数组中项目的副本。

       numbers2 = numbers1.ToArray();

答案 1 :(得分:1)

数组是引用类型,无论数组的值是否为值类型。

分配数组时,您正在创建数组变量指向的内存块。将一个数组变量分配给另一个时,您将分配内存引用,而不是数组中的值。因此,您的numbers1numbers2数组都指向同一组值。

现在这应该是有道理的。想象一下,如果你有一个包含一百万个元素的数组,那么每次你分配或传递你周围的数组都会产生副本时,这将是一个可怕的性能问题。

因此,您需要明确说明何时要复制数组。

最简单的方法是:

numbers2 = numbers1.ToArray(); // yes, this copies the entire array.

答案 2 :(得分:0)

使用此:

numbers2 = numbers1;

您正在将第一个数组的引用分配给第二个数组。所以它丢失了原始内容并开始指向numbers1。如果您要将numbers1的部分或全部项目复制到numbers2,请使用Clone()use loop to copy elements

答案 3 :(得分:0)

您是否尝试过.ToArray()方法?它将创建新数组,而不是通过引用Array2= Array.ToArray(); Click here for more about .ToArrray()

分配

答案 4 :(得分:0)

尝试使用.ToArray();Clone为我工作

我的建议是.ToArray();