C#之克隆

克隆就是创建当前实例副本的心对象

克隆分为深度克隆和浅度克隆

浅度克隆:是指将对象中的所有字段逐字复杂到一个新对象,对值类型字段只是简单的拷贝一个副本到目标对象,改变目标对象中值类型字段的值不会反映到原始对象中,因为拷贝的是副本,对引用型字段则是指拷贝他的一个引用到目标对象。改变目标对象中引用类型字段的值它将反映到原始对象中,因为拷贝的是指向堆是上的一个地址,一般通过c#所给的方法MemberWiseClone()实现;

深度克隆:深拷贝与浅拷贝不同的是对于引用字段的处理,深拷贝将会在新对象中创建一个新的对象和原始对象中对应字段相同(内容相同)的字段,也就是说这个引用和原始对象的引用是不同, 我们改变新对象中这个字段的时候是不会影响到原始对象中对应字段的内容。须实现 ICloneable接口中的Clone方法,且需要需要克隆的对象加上[Serializable]特性


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace 克隆
{
    class Program
    {
        static void Main(string[] args)
        {
            CloneDemo demo = new CloneDemo();
            Console.WriteLine(demo.name);

            CloneDemo demo1 = demo.Clone() as CloneDemo;
            demo1.name = "demo1";
            demo1.num[0] = 1;
            Console.WriteLine(demo.name+"  "+demo.num[0]);

            CloneDemo demo2 = demo.Clone() as CloneDemo;
            demo2.name = "demo2";
            demo2.num[0] = 2;
            Console.WriteLine(demo.name+"  "+demo.num[0]);

            Console.WriteLine(object.ReferenceEquals(demo1, demo2));
            Console.ReadKey();

        }
    }

    class CloneDemo:ICloneable
    {
        public string name = "demo";

        public int[] num = { 10, 20 };
        public CloneDemo()
        { }
        public object Clone()
        {
            //return this as object;//直接返回当前实例  这样的话 其他对象改了值就相当于改了当前对象的值


            return  this.MemberwiseClone();//浅度复制  这样的话其他的对象改了值 与当前对象无关但是由于浅复制对于值类型是拷贝的副本 对于引用类型拷贝的是引用  也就是说在
                                            //引用类型的值发生变化了 原来类型的值也会发生变化

            // return new CloneDemo() as object;//又有深度复制 这样的话其他的对象改了值 与当前对象无关 同时对引用类型拷贝的是一个新的对象 所以更改后 值是不会改变的
        }
 
    }
}


你可能感兴趣的:(C#之克隆)