深浅拷贝区别


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.序列化

就到这里,其他几种我就不再实现,有时间再一一实现