• C#深拷贝(复制)与浅(复制)


    简单来介绍一下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.序列化

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

  • 相关阅读:
    整数参数求和
    《Objective-C 程序设计》读后感
    构建之法前三章精读读后感
    《java编程思想》读后感
    《JAVA核心技术》观后感
    构建之法读后感
    一、构建之法读后感
    开发MIS系统需要的技术及其含义、作用
    阅读笔记一
    Java课后练习9(异常处理)
  • 原文地址:https://www.cnblogs.com/xiongyingaoxiang/p/14905761.html
Copyright © 2020-2023  润新知