深拷贝和浅拷贝主要涉及到类对象之间的关联关系
浅拷贝
1.定义人类
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Dog Dog { get; set; } //每个人都有自己的狗
}
2.定义狗类
class Dog
{
public string Name { get; set; }
}
3.测试这里其实是有三个对象,两个人,一个狗,p1和p2的Dog属性都指向了同一个对象,他们的引用都是同一个dog,对象引用同一个就是浅拷贝!!
static void Main(string[] args)
{
Dog d1 = new Dog() { Name="旺财"};
Person p1 = new Person() { Name="aaa",Age=111,Dog=d1};
Person p2 = new Person();
p2.Name = p1.Name;
p2.Age = p1.Age;
p2.Dog = d1; //p2的这只狗是指向d1的,他们实质上是同一只狗
p1.Dog.Name = "小黑";
Console.WriteLine(p2.Dog.Name); //这时候打印的也是小黑!!
Console.ReadKey();
}
打印的结果:
深拷贝
其他跟上述相同,把测试类改动一下:
static void Main(string[] args)
{
Dog d1 = new Dog() { Name="旺财"};
Dog d2 = new Dog();
Person p1 = new Person() { Name="aaa",Age=111,Dog=d1};
Person p2 = new Person();
p2.Name = p1.Name;
p2.Age = p1.Age;
d2.Name = p1.Dog.Name;
p2.Dog = d2;
p1.Dog.Name = "小黑";
Console.WriteLine(p2.Dog.Name); //这时候打印的就不是小黑!! 而是还是旺财!!!
Console.ReadKey();
}
总结一下:如果对象之间有引用关系,如果拷贝的时候共享被引用的对象就是浅拷贝,如果被引用的对象要拷贝一份出来就是深拷贝!