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

我读过Array.Clone执行浅拷贝,但是此代码建议创建原始数组的深层副本,即克隆数组中的任何更改都不会反映到原始数组中

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

我在这里错过了明显的东西吗?


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

有关差异的更多信息,请参阅以下内容:深拷贝和浅拷贝之间有什么区别?


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

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

副本只有一个层次:因此很浅。 深层副本可以克隆所有引用的对象(但不能用int整体显示)。


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

例:

class SomeClass {
    public Int32 SomeProperty { get; set; }
}

SomeClass[] arr = new [] {
    new SomeClass { SomeProperty = 99 },
    new SomeClass { SomeProperty = 98 },
    new SomeClass { SomeProperty = 92 },
    new SomeClass { SomeProperty = 97 },
    new SomeClass { SomeProperty = 95 }
}

SomeClass[] newArr = (SomeClass[])arr.Clone();

newArr[0].SomeProperty = 100;

Console.WriteLine(arr[0].SomeProperty);
链接地址: http://www.djcxy.com/p/40801.html

上一篇: Array.Clone() performs deep copy instead of shallow copy

下一篇: Why is the Object class's clone() method giving a deep copy of object?