C#实例复制和深度复制的实现

来源:互联网 发布:js tr ctrl 左键 监听 编辑:程序博客网 时间:2024/06/06 04:39

     深度复制与浅表复制的区别在于,浅表复制只复制值类型的值,而对于实例所包含的对象依然指向原有实例。


   浅复制:MemberwiseClone()

  深复制:反射、序列化、树


实例:浅复制MemberwiseClone()、深复制序列化


 class Program
    {
        [Serializable]
        public class Car 
        {
            public string name;
            public Car(string name)
            {
                this.name = name;
            }
        }
        [Serializable]
        public class Person:ICloneable
        {
            public int id;
            public string name;
            public Car car;
            public Person()
            {
            }
            public Person(int id, string name, Car car)
            {
                this.id = id;
                this.name = name;
                this.car = car;
            }


            public Object Clone()  //实现ICloneable接口,达到浅表复制。浅表复制与深度复制无直接有关系。 对外提供一个创建自身的浅表副本的能力
            {
                return this.MemberwiseClone();
            }


        }


        //要复制的实例必须可序列化,包括实例引用的其它实例都必须在类定义时加[Serializable]特性。
        public static T Copy<T>(T RealObject)
        {
            using (Stream objectStream = new MemoryStream())
            {
                //利用 System.Runtime.Serialization序列化与反序列化完成引用对象的复制   
                IFormatter formatter = new BinaryFormatter();
                formatter.Serialize(objectStream, RealObject);
                objectStream.Seek(0, SeekOrigin.Begin);
                return (T)formatter.Deserialize(objectStream);
            }
        }   



      
        static void Main(string[] args)
        {
            Person p1 = new Person(1, "Scott", new Car("宝马"));
            Console.WriteLine("原始值:P1:id={0}----------->name={1}------>car={2}", p1.id, p1.name, p1.car.name);
            Person p2 = Copy<Person>(p1); //深复制
            Person p3 = p1.Clone() as Person;//浅表复制
            Console.WriteLine("改变P1的值");
            p1.id = 2;
            p1.name = "Lacy";
            p1.car.name = "红旗";
            Console.WriteLine("P1:id={0}----------->name={1}------>car={2}", p1.id, p1.name, p1.car.name);
            Console.WriteLine("深度复制:P2:id={0}----------->name={1}------>car={2}", p2.id, p2.name, p2.car.name);
            Console.WriteLine("浅表复制:P3:id={0}----------->name={1}------>car={2}", p3.id, p3.name, p3.car.name);
            Console.ReadKey();


        }

效果:




例如:深度复制

List<Person> ListP=new List<Person>();
ListP.Add(new Person(1,"Scott",new Car("宝马")));
ListP.Add(new Person(2,"Lacy",new Car("红旗")));


List<Person> ListP2=Copy<List<Person>>(ListP);




推荐阅读:构建可克隆的对象(icloneable 浅复制)

文章来源:http://blog.csdn.net/flyingdream123/article/details/9294973





原创粉丝点击