深度复制和浅复制的区别是什么?
当前回答
复制array:
Array是一个类,这意味着它是引用类型,因此array1 = array2的结果 在引用同一个数组的两个变量中。
但是看看这个例子:
static void Main()
{
int[] arr1 = new int[] { 1, 2, 3, 4, 5 };
int[] arr2 = new int[] { 6, 7, 8, 9, 0 };
Console.WriteLine(arr1[2] + " " + arr2[2]);
arr2 = arr1;
Console.WriteLine(arr1[2] + " " + arr2[2]);
arr2 = (int[])arr1.Clone();
arr1[2] = 12;
Console.WriteLine(arr1[2] + " " + arr2[2]);
}
浅克隆意味着只复制克隆数组所表示的内存。
如果数组包含值类型对象,则复制值;
如果数组包含引用类型,则只复制引用-因此有两个数组,其成员引用相同的对象。
要创建复制引用类型的深度复制,必须循环遍历数组并手动克隆每个元素。
其他回答
浅拷贝尽可能少地复制。集合的浅拷贝是集合结构的副本,而不是元素的副本。使用浅拷贝,两个集合现在共享单个元素。
深度复制复制一切。集合的深层副本是两个集合,原始集合中的所有元素都被复制。
我在这里没有看到一个简短的,容易理解的答案——所以我会试一试。
使用浅拷贝,源指向的任何对象也会被目标指向(因此不会复制引用的对象)。
使用深度复制,源指向的任何对象都将被复制,而目标指向的副本(因此现在每个引用的对象都有2个)。这是递归向下的对象树。
深拷贝
深度复制复制所有字段,并复制由字段指向的动态分配的内存。当对象与其引用的对象一起复制时,就会发生深度复制。
浅拷贝
浅复制是对象的逐位复制。创建一个新对象,该对象具有原始对象中值的精确副本。如果对象的任何字段是对其他对象的引用,则只复制引用地址,即只复制内存地址。
复制array:
Array是一个类,这意味着它是引用类型,因此array1 = array2的结果 在引用同一个数组的两个变量中。
但是看看这个例子:
static void Main()
{
int[] arr1 = new int[] { 1, 2, 3, 4, 5 };
int[] arr2 = new int[] { 6, 7, 8, 9, 0 };
Console.WriteLine(arr1[2] + " " + arr2[2]);
arr2 = arr1;
Console.WriteLine(arr1[2] + " " + arr2[2]);
arr2 = (int[])arr1.Clone();
arr1[2] = 12;
Console.WriteLine(arr1[2] + " " + arr2[2]);
}
浅克隆意味着只复制克隆数组所表示的内存。
如果数组包含值类型对象,则复制值;
如果数组包含引用类型,则只复制引用-因此有两个数组,其成员引用相同的对象。
要创建复制引用类型的深度复制,必须循环遍历数组并手动克隆每个元素。
为了补充其他答案,
对象的浅拷贝对值类型执行逐值复制 基于属性,并通过引用复制基于引用类型的属性。 对象的深度复制对基于值类型的对象执行逐值复制 属性,以及基于引用类型的按值复制 层次结构深处的属性(引用类型)