zoukankan      html  css  js  c++  java
  • c# 关于浅拷贝和深拷贝

    class Program
    {
        static void Main(string[] args)
        {
            //浅拷贝
            Person p1 = new Person();
            p1.Name = "张三";
            p1.Mycar = new Car() { Brand = "奥迪A6" };
    
            Person p2 = new Person();
            p2.Name = p1.Name;
            p2.Mycar = p1.Mycar; //p1.Mycar 和 p2.Mycar 指向同一个内存地址
    
            Console.WriteLine("p1.Mycar:" + p1.Mycar.Brand);
            Console.WriteLine("p2.Mycar:" + p2.Mycar.Brand);
            //p1.Mycar:奥迪A6
            //p2.Mycar:奥迪A6
    
            p1.Mycar.Brand = "奔驰";
            Console.WriteLine("p1.Mycar:" + p1.Mycar.Brand);
            Console.WriteLine("p2.Mycar:" + p2.Mycar.Brand);
            //p1.Mycar:奔驰
            //p2.Mycar:奔驰
    
            //深拷贝    
            Person p3 = new Person();
            p3.Name = "张三";
            p3.Mycar = new Car() { Brand = "奥迪A6" };
    
            Person p4 = new Person();
            p4.Name = p3.Name;
            p4.Mycar = new Car() { Brand = p3.Mycar.Brand }; //这里重新创建了Car对象,p3.Mycar 和 p4.Mycar 指向两个不同内存地址
    
            Console.WriteLine("p3.Mycar:" + p3.Mycar.Brand);
            Console.WriteLine("p4.Mycar:" + p4.Mycar.Brand);
            //p1.Mycar:奥迪A6
            //p2.Mycar:奥迪A6
    
            p3.Mycar.Brand = "奔驰";
            Console.WriteLine("p3.Mycar:" + p3.Mycar.Brand);
            Console.WriteLine("p4.Mycar:" + p4.Mycar.Brand);
            //p1.Mycar:奔驰
            //p2.Mycar:奥迪A6
    
            //总结:
            //浅拷贝是共用一个内存地址,当p1改变p2也随着改变。
            //深拷贝是完全重新创建了一个新的对象,当p1改变不会对p2任何影响。
    
                
            //浅拷贝2
            Person p5 = p1.QianCopy();
    
            //深拷贝2
            Person p6 = p1.ShenCopy();
    
            Console.ReadKey();
        }
    }
    
    [Serializable]  //添加特性,标记为可序列化。
    public class Person
    {
        public string Name { get; set; }
        public Car Mycar { get; set; }
    
        //浅拷贝--通过父类object内部方法MemberwiseClone实现
        public Person QianCopy()
        {
            return (Person)this.MemberwiseClone();
        }
        //深拷贝--通过二进制序列化
        public Person ShenCopy()
        {
            //System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, this); //序列化
            ms.Position = 0;  //注意一点,流的当前位置要回到开头位置
            return (Person)bf.Deserialize(ms); //反序列化
        }
    }
    
    [Serializable]
    public class Car
    {
        public string Brand { get; set; }
    }
  • 相关阅读:
    gitlab配置ssh连接
    java 函数编程之Consumer接口的使用
    一枚程序猿的MacBook M1详细体验报告
    【线上问题排查技巧】动态修改LOGGER日志级别
    【线上排查实战】AOP切面执行顺序你真的了解吗
    阿里巴巴Canal常见问题:重复解析/Filter失效/消费落后
    使用Binlog日志恢复误删的MySQL数据实战
    Git实战技巧:恢复被强制push -f失踪的代码
    一次完整的JVM堆外内存泄漏故障排查记录
    Java线上问题排查神器Arthas快速上手与原理浅谈
  • 原文地址:https://www.cnblogs.com/han1982/p/4881713.html
Copyright © 2011-2022 走看看