一、什么是深拷贝和浅拷贝
对于所有面向对象的语言,复制永远是一个容易引发讨论的题目,C#中也不例外,此类问题在面试中极其容易被问道,我们应该在了解浅拷贝和深拷贝的基本概念的基础上,从设计的角度进一步考虑如何支持对象的拷贝
在System.Object类中,有一个受保护的方法object.MemberwiseClone(),这个方法实现了对象的复制。事实上,它所实现的就是我们所称的浅拷贝。
深拷贝:指的是拷贝一个对象时,不仅仅把对象的引用进行复制,还把该对象引用的值也一起拷贝。这样进行深拷贝后的拷贝对象就和源对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。比如一个黄狗叫大黄,使用克隆另外一个黄狗叫小黄,这样大黄和小黄就相对独立了,他们不互相影响。在.NET中int,double以及结构体和枚举等。
int a=12;
int c=a;//进行了深拷贝
c=232//不影响
浅拷贝:指的时拷贝一个对象时,仅仅拷贝对象的引用进行拷贝,但是拷贝对象和源对象还是引用同一份实体。此时,其中一个对象的改变都会影响到另外一个对象。就像一个人改名了一样,他还是这个人,只不过名字变了而已
internal class Program
{
static void Main(string[] args)
{
YDog sourceP = new YDog() { Name = "大黄" };
YDog copyP = sourceP;//浅拷贝
copyP.Name = "小黄";//拷贝对象改变Name值
//结果都是小黄,因为实现的时浅拷贝,一个对象的改变都会影响到另一个对象
Console.WriteLine("YDog.Name: [SourceP: {0}] [CopyP:{1}]", sourceP.Name, copyP.Name);
Console.Read();
}
}
public class YDog
{
public string Name { get; set; }
}
所谓的浅拷贝,是指拷贝一个对象的时候,拷贝原始对象中所有的非静态值类型成员和所有的引用类型成员的引用。换言之,新的对象和原始对象将共享所有引用类型成员的实际对象。而相对的,深拷贝时指不仅复制所有的非静态值类型成员,而且也复制所有引用类型成员的实际对象。深拷贝和浅拷贝的概念时递归的,也就是说当引用类型成员中包含另外一个引用类型成员时,拷贝的时候将对其内部成员实行它同样的复制策略