zoukankan      html  css  js  c++  java
  • 简述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;
            }
        }

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


  • 相关阅读:
    springboot将接口内容快速生成接口文档导出,swagger将api文档以表格文档导出
    IDEA2019.2或2019.3激活码失效后重新激活教程
    Java代码自动生成,生成前端vue+后端controller、service、dao代码,根据表名自动生成增删改查功能
    百度网盘下载慢解决办法,最新.浏览器下载速度突破方法
    smartGit 版本19.1没有settings文件如何破解
    arp欺骗软件(来自互联网)
    关闭学生端v1.0(附链接)
    [TODO]multiaet/set/multimap/map
    树状数组【洛谷3374】
    luoguP1439
  • 原文地址:https://www.cnblogs.com/hueychan/p/10575913.html
Copyright © 2011-2022 走看看