• 简述C#中浅复制和深复制


    引用类型直接进行“=”来复制是不可以的,简单的复制成员可以通过派生在System.Object中的MemberwiseClone()方法来完成。这是一个受保护的方法。

    我们简单的代码实现如下:

        public abstract class Animal
        {
            public string Name { get; set; }
            public double Weight { get; set; }
            public abstract void Sounds();
        }
        public class Dog : Animal, ICloneable
        {
            public override void Sounds()
            {
                Console.WriteLine("{0}汪汪汪", Name);
            }
            public object Clone()
            {
                return (Object)this.MemberwiseClone(); //实现克隆方法
            }
            public object Clone(string name, double weight)
            {
                var dog = (Dog)this.Clone();
                dog.Name = name;
                dog.Weight = weight;
                return dog;
            }
        }

    Dog类实现了接口ICloneable。在main函数中编写测试代码

            static void Main(string[] args)
            {
                Dog dog1 = new Dog { Name = "二黄", Weight = 20.0 };
                dog1.Sounds();
                var dog2 = (Dog)dog1.Clone("二哈", 19.0);
                dog2.Sounds();
                Console.ReadKey();
            }

    运行结果如下


    我们修改一下Dog类,添加主人Master

        public class Master
        {
            public string Name { get; set; }
        }
        public class Dog : Animal, ICloneable
        {
            private Master master;
            public Dog()
            {
                master = new Master();
            }
            public override void Sounds()
            {
                Console.WriteLine("{0}家的狗:{1}正在汪汪汪叫", master.Name, Name);
            }
            public void SetMasterName(string name)
            {
                master.Name = name;
            }
            public object Clone()
            {
                return (Object)this.MemberwiseClone(); //实现克隆方法
            }
            public object Clone(string name, double weight)
            {
                var dog = (Dog)this.Clone();
                dog.Name = name;
                dog.Weight = weight;
                return dog;
            }
        }

    这里引用了外部的对象

            static void Main(string[] args)
            {
                Dog dog1 = new Dog { Name = "二黄", Weight = 20.0 };
                dog1.SetMasterName("张三");
                var dog2 = (Dog)dog1.Clone("二哈", 19.0);
                dog2.SetMasterName("李四");
                dog1.Sounds();
                dog2.Sounds();
                Console.ReadKey();
            }

    结果如下:


    这不是我们想看到的,我们需要修改引用Master类也实现ICloneable接口。

        public class Master: ICloneable
        {
            public string Name { get; set; }
            public object Clone()
            {
                return (Object)this.MemberwiseClone(); //实现克隆方法
            }
        }
        public class Dog : Animal, ICloneable
        {
            private Master master;
            public Dog()
            {
                master = new Master();
            }
            public override void Sounds()
            {
                Console.WriteLine("{0}家的狗:{1}正在汪汪汪叫", master.Name, Name);
            }
            public void SetMasterName(string name)
            {
                master.Name = name;
            }
            public object Clone()
            {
                return (Object)this.MemberwiseClone(); //实现克隆方法
            }
            public object Clone(string name, double weight)
            {
                var dog = (Dog)this.Clone();
                dog.Name = name;
                dog.Weight = weight;
                dog.master= (Master)master.Clone();
                return dog;
            }
        }

    最后得到我们想要的结果:


  • 相关阅读:
    思源:秒级体验百亿级数据量监控钻取
    禧云Redis跨机房双向同步实践
    谈谈数据中台技术体系
    RCA:收单设备调用云端接口频繁超时排查总结
    技术上的“深淘滩,低作堰”
    企业私有源代码上传github致入侵之大疆案判决了
    那些年我们一起犯过的错
    异地双活的四个误区
    没有预见性你凭什么晋升
    中国IT史上两大严重事故对我们的警醒及预防措施
  • 原文地址:https://www.cnblogs.com/hueychan/p/10575913.html
Copyright © 2020-2023  润新知