深浅拷贝区别
C#深拷贝(复制)与浅(复制)
所谓拷贝,就是赋值。把一个变量赋给另外一个变量,就是把变量的内容进行拷贝。把一个对象的值赋给另外一个对象,就是把一个对象拷贝一份。基本类型赋值时,赋的是数据(所以,不存在深拷贝和浅拷贝的问题)。浅拷贝只是把arr1的地址拷贝的一份给了arr2,并没有把arr1的数据拷贝一份。简单来介绍一下C#深浅拷贝问题
浅拷贝:复制其另一个对象的引用(在堆中使用的是同一个对象的引用);
深拷贝:而逐一复制被复制对象的数据成员的方式称为深复制(在堆中创建新的一块内存空间,使用的不是同一个对象的引用)
创建一个Person类:
public class Person { public int Id { get; set; } //值类型 public string Name { get; set; } //引用类型 public int Age { get; set; } }
浅拷贝(复制):p2改变,p1也跟着改变,使用的同一个引用对象persion
class Program { static void Main(string[] args) { //初始化一个persion实例 Person p1 = new Person { Id = 1, Name = "张三", Age = 20 }; Person p2 = p1; //浅拷贝 p2.Id = 2; p2.Name = "李四"; Console.WriteLine($"p1的编号{p1.Id},p1的名字{p1.Name}; p2的编号{p2.Id},p2的名字{p2.Name}" ); } }
输出:
深拷贝(复制):
C#中Object类提供了一个MemberwiseClone方法实现的就是上述机制。
MemberwiseClone(): 创建当前对象的浅拷贝(用来实现浅拷贝的);
实现深拷贝C# 提供一个ICloneable接口,实现Clone方法来实现深拷贝
public class Person:ICloneable { public int Id { get; set; } //值类型 public string Name { get; set; } //引用类型 public int Age { get; set; } public object Clone() { Person person = (Person)this.MemberwiseClone(); //创建当前对象的浅拷贝。 return person; } }
class Program { static void Main(string[] args) { //初始化一个persion实例 Person p1 = new Person { Id = 1, Name = "张三", Age = 20 }; Person p2 = p1; //浅拷贝 p2.Id = 2; p2.Name = "李四"; Person p3 = (Person)p1.Clone(); //深拷贝 p3.Id = 3; p3.Name = "王五"; Console.WriteLine($"p1的编号{p1.Id},p1的名字{p1.Name}; p2的编号{p2.Id},p2的名字{p2.Name}; p3的编号{p3.Id},p3的名字{p3.Name}" ); } }
输出:
实现深拷贝的方式还有以下几种:
1.创建一个新的对象,把属性值赋值给新对象的属性值,例如再添加一个Student的类,同时创建Persion实例和Student实例,把presion的name属性赋值给student的name,再改变student的name值(和上面方法的原理是一样的:都是两个实例);
2.反射
3.表达式目录树
4.序列化
就到这里,其他几种我就不再实现,有时间再一一实现