引子
如果有一个ListA,里面存放了一定的数据。现在,需要对其进行一次拷贝,最直觉的方法就是
List<int> a = new List<int> { 1, 3, 5, 7, 9 };
List<int> b = a;
接着我们对ListB进行操作,比如将ListB中的数据乘以2
for (int i = 0; i < b.Count; i++)
{
b[i] *= 2;
}
最后我们打印出结果
foreach(var it in a){
Console.WriteLine(it+”\t”);
}
结果 2 6 10 14 18
很明显,我们对B的操作同样作用到了A上,因为List是一种引用类型,赋值的操作实际上是对地址的引用。这种拷贝也可以称为引用拷贝。
所以,对于引用类型的特殊性,我们在对其进行复制时不同的处理方法分为浅拷贝和深拷贝。其实没什么内容
浅拷贝
浅拷贝是一种按位拷贝的方式,即将原对象中的类型一一对应的复制到新的对象中。
通过例子我们理解了引用类型的特殊性,所以如果原对象的类型中包含有引用类型,这样的复制同样是一种引用复制。
深拷贝
深拷贝对应的就是进一步的对原数据中的子对象里含有的引用类型的复制。
简单总结
— | 是否同一地址 | 子对象是否同一地址 |
---|---|---|
引用复制 | 是 | 是 |
浅拷贝 | 否 | 是 |
深拷贝 | 否 | 否 |