深浅复制

浅复制:字段是值类型,则对其执行逐位复制,通俗讲就是赋值;字段为引用类型,则直接复制其引用,也就是说原始对象和克隆对象引用的是同一个对象。

深复制:值类型字段的复制方式与浅复制相同;对于引用类型的字段,重新实例化一个内容相同但引用不同的字段,也就是说原始对象和克隆对象引用的不是同一个对象。

文字可能过于抽象,例子:

namespace Project_1
{
    class IdInfo
    {
        public int id;

        public IdInfo(int id)
        {
            this.id = id;
        }
    }

    class Person
    {
        public int age;
        public string name;
        public IdInfo idInfo;

        public Person(int age, string name, int id)
        {
            this.age = age;
            this.name = name;
            this.idInfo = new IdInfo(id);
        }
        
        public Person ShallowCopy()
        {
            return (Person)this.MemberwiseClone();
        }

        public Person DeepCopy()
        {
            Person p = (Person)this.MemberwiseClone();
            p.name = string.Copy(name);
            p.idInfo = new IdInfo(idInfo.id);
            return p;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //浅复制测试用例
            Person p1 = new Person(15, "Wyhon", 1234);
            Person p2 = p1.ShallowCopy();
            Display(p1);
            Display(p2);
            
            Console.WriteLine("------------------------------------------------------------");

            p1.age = 16;
            p1.name = "Wyhon1";
            p1.idInfo.id = 5678;
            Display(p1);
            Display(p2);

            //深复制测试用例
            Console.WriteLine("------------------------------------------------------------");
            Person p3 = p1.DeepCopy();
            p1.age = 17;
            p1.name = "wyhon2";
            p1.idInfo.id = 7891;
            Display(p1);
            Display(p3);
        }

        static void Display(Person p)
        {
            Console.WriteLine("Name: {0}, Age: {1}, ID: {2}", p.name, p.age, p.idInfo.id);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/hang981601026/article/details/81744950
今日推荐