我是初学者,这个问题可能非常明显,但我一直遇到很多麻烦。
在以下代码中,当i2设置为i时,i2随后更改时不会更改。但是,当arr2设置为arr时,当arr2随后更改时,也会更新arr。
为什么?有什么区别?
{{1}}
答案 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的引用。
有关详细信息,请参阅此处:
答案 2 :(得分:1)
在下面的第一种情况下,INT
是一个struct
类型,它是value type
,因此每次分配给其他变量时都会按位值复制,因此在下面的代码中i
和i2
都有一个单独的副本,更改一个不会影响其他人。
int i = 5;
int i2 = i;
对于第二种情况,如下Array
是Class
(继承自基本类型System.Aray
),其设计为reference type
,因此您只需指定数组到其他数组变量。因此,更改一个也将影响其他因为引用堆内存中存在的相同数组对象。
int[] arr = { 5 };
int[] arr2 = arr;
请参阅MSDN中的阵列文档 Array Class
答案 3 :(得分:0)
嘿,在第一种情况下,这些是变量,因此这些变量通过内存映射彼此无关。 在第二种情况下,它是分配数组的引用,因为答案是3.Arr所做的任何更改也将在arr2上找到。