概要
- 引用类型对象变量赋值的时候是指向同一个对象;
- 可以通过自顶一个拷贝方法复制出来一个新的对象,
- 如果对象之间有引用关系,如果拷贝的时候共享被引用的对象就是浅拷贝,如果被引用的对象要拷贝一份出来就是深拷贝。
拷贝
static void Main(string[] args)
{
Person p1 = new Person();
p1.Name = "one";
p1.Age = 12;
**//(1)**
//Person p2 = p1;//让p2指向p1所指向的对象
//p1.Age = 10;
//Console.WriteLine(p2.Age);
**//(2)**
Person p2 = new Person();//拷贝 Clone
p2.Name = p1.Name;
p2.Age = p1.Age;
p1.Age = 999;
Console.WriteLine(p2.Age);
Console.ReadKey();
}
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
}
- 再(1)代码段中让p2指向p1所指向的对象,随p1Age的改变p2.Age也会随着变化
- 在(2)代码段中p2拷贝了p1的所有属性的值,随着p1属性值的改变,p2不会受影响.
浅拷贝
class Program
{
static void Main(string[] args)
{
Person p1 = new Person();
p1.Name = "one";
p1.Age = 12;
Dog d1 = new Dog();
d1.Name = "小黑";
p1.Dog = d1;
Person p2 = new Person();
p2.Name = p1.Name;
p2.Age = p1.Age;
p2.Dog = p1.Dog;
//对象还是指向同一份
p1.Dog.Name = "小白";
Console.WriteLine(p2.Dog.Name);
Console.ReadKey();
}
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Dog Dog { get; set; }
}
class Dog
{
public string Name { get; set; }
}
虽然p2对p1的普通属性进行了拷贝.但是对于Dog对象仍然是引用同一个对象,所以随着p1.Dog.Name值的改变,p2.Dog.Name的值也随着变化;则共享同一个引用对象即为浅拷贝
深拷贝
static void Main(string[] args)
{
Person p1 = new Person();
p1.Name = "one";
p1.Age = 12;
Dog d1 = new Dog();
d1.Name = "小黑";
p1.Dog = d1;
Person p2 = new Person();
p2.Name = p1.Name;
p2.Age = p1.Age;
Dog d2 = new Dog();
d2.Name = p1.Dog.Name;
p2.Dog = d2;//对象也是拷贝了一份
p1.Dog.Name = "小白";
Console.WriteLine(p2.Dog.Name);
Console.ReadKey();
}
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Dog Dog { get; set; }
}
class Dog
{
public string Name { get; set; }
}
在这里p2把对象也拷贝了一份,随着p1.Dog.Name值的改变,p2.Dog.Name的值不会受到影响;则如果被引用的对象要拷贝一份出来就是深拷贝
总结
了解浅拷贝和深拷贝能帮你更安全安心的去操作数据,可以根据实际情况来去使用深拷贝和深拷贝.
ps:小白文章