您的位置:首页 > 编程语言 > C#

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

2017-07-20 16:38 309 查看
     深度复制与浅表复制的区别在于,浅表复制只复制值类型的值,而对于实例所包含的对象依然指向原有实例。

   浅复制: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: