C# Array.Clone()执行深度复制而不是浅层复制

C# Array.Clone()执行深度复制而不是浅层复制,c#,clone,shallow-copy,C#,Clone,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[

我已经读过了,但是这段代码表明创建了原始数组的深层副本,即克隆数组中的任何更改都不会反映在原始数组中

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

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

副本只降低了一个级别:因此很浅。深度复制将克隆所有引用的对象(但不能用ints显示)

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

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


副本只降低了一个级别:因此很浅。深度复制将克隆所有引用的对象(但不能用int显示)。

在某些高级数组或列表中,很难仅使用Array.clone() 改用像我开发的FastDeepCloner这样的插件。它将侵入性地克隆对象

var newArr= FastDeepCloner.DeepCloner.Clone(arr);

在某些高级的数组或列表中,仅使用Array.Clone()是非常困难的 改用像我开发的FastDeepCloner这样的插件。它将侵入性地克隆对象

var newArr= FastDeepCloner.DeepCloner.Clone(arr);

更好的描述应该是“复制不可变对象集合时,深度复制和浅层复制之间没有区别”。所有原语都是不可变的,但在任何一组纯不可变对象上都可以看到相同的行为。考虑到这一点,你需要说“不可变结构”,答案的第二部分才是真的。不可变类在技术上仍会表现不同,因为内存中只有不可变对象的一个副本。更好的描述是“复制不可变对象集合时,深度副本和浅层副本之间没有区别。”,所有的原语都是不可变的,但是你可以在任何一组纯粹不可变的对象上看到同样的行为。考虑到这一点,你需要说“不可变结构”,你的答案的第二部分才是真的。不可变类在技术上仍然表现不同,因为内存中只有不可变对象的一个副本。