未修改时更改数组

时间:2016-06-19 18:02:55

标签: c# arrays

我是初学者,这个问题可能非常明显,但我一直遇到很多麻烦。

在以下代码中,当i2设置为i时,i2随后更改时不会更改。但是,当arr2设置为arr时,当arr2随后更改时,也会更新arr。

为什么?有什么区别?

{{1}}

4 个答案:

答案 0 :(得分:2)

声明

int[] arr2 = arr;

不会创建新的数组对象,只会为arr指定引用。这就是为什么当您修改arr2时,arr也会被修改。 int的情况是不同的,因为int(或Int32)实际上是struct,而不是类,并且整数的内存在堆栈上分配,而不是在堆中。更多详情:C# Concepts: Value vs Reference Types

答案 1 :(得分:1)

在C#中,数组是引用类型。当你指定arr2 = arr时,你告诉arr2在内存中使用arr的引用。

有关详细信息,请参阅此处:

https://msdn.microsoft.com/en-us/library/2z4khca9.aspx

https://msdn.microsoft.com/en-us/library/hyfeyz71.aspx

答案 2 :(得分:1)

在下面的第一种情况下,INT是一个struct类型,它是value type,因此每次分配给其他变量时都会按位值复制,因此在下面的代码中ii2都有一个单独的副本,更改一个不会影响其他人。

    int i = 5;
    int i2 = i;

对于第二种情况,如下ArrayClass(继承自基本类型System.Aray),其设计为reference type,因此您只需指定数组到其他数组变量。因此,更改一个也将影响其他因为引用堆内存中存在的相同数组对象。

    int[] arr = { 5 };
    int[] arr2 = arr;

请参阅MSDN中的阵列文档 Array Class

答案 3 :(得分:0)

嘿,在第一种情况下,这些是变量,因此这些变量通过内存映射彼此无关。 在第二种情况下,它是分配数组的引用,因为答案是3.Arr所做的任何更改也将在arr2上找到。