Array.Clone()执行深拷贝而不是浅拷贝

时间:2017-09-17 15:49:17

标签: c# clone shallow-copy

我已经读过Array.Clone performs shallow copy,但是这段代码表明创建了原始数组的深层副本,即克隆数组中的任何更改都没有反映在原始数组中

int[] arr = new int[] { 99, 98, 92, 97, 95 };
int[] newArr = (int[])arr.Clone();
//because this is a shallow copy newArr should refer arr
newArr[0] = 100;
//expected result 100
Console.WriteLine(arr[0]);//print 99

我错过了一些明显的东西吗?

4 个答案:

答案 0 :(得分:2)

  

因为这是一个浅拷贝,newArr应该引用arr

不,数组及其元素被复制。但是不会复制对元素中对象的引用。

副本仅下降一级:因此很浅。深层副本将克隆所有引用的对象(但不能用int显示。)

答案 1 :(得分:1)

当复制不可变结构的集合(诸如它的基元是不可变的)时,深复制和浅复制之间没有区别。它们按值复制 - 因此它就像深度复制一样。

请参阅以下内容了解更多信息:What is the difference between a deep copy and a shallow copy?

答案 2 :(得分:0)

尝试相同的代码但使用具有属性为整数的类。由于数组元素是值类型,因此克隆数组的元素是它们自己的"实例"。

示例:

117.214682594

答案 3 :(得分:0)

某些高级数组或列表中的

<>真的很难只使用Array.Clone() 使用像FastDeepCloner这样的插件,它会侵入地克隆对象。

int i = if((0xc0 & c) == 0xc0){return 1;}