深复制与浅复制的实现

  在使用System.Object的方法中有一个受保护的方法object MemberwiseClone(),这个方法实现了对象的复制,事实上,它所实现的就是浅复制。

  所谓的浅复制,是指复制一个对象的时候,复制原始对象所有的非静态值类型成员和所有的引用类型成员的引用。新的对象和原始对象将共享所有的引用类型成员的实际对象。而深复制是指不仅复制所有的非静态值类型成员,而且复制所有引用类型成员的实际对象。

  类型基类System.Object已经为所有类型都实现了浅复制,类型所要做的就是公开一个复制的接口,而通常的,这个接口会借由实现ICloneable接口来实现。ICloneable只包含一个方法Clone。该方法既可以被实现为浅复制也可以被实现为深复制,具体如何取舍需要根据具体类型的需求来决定:

View Code
 1 /* 
 2  * 功能:浅复制与深复制示例
 3  * 作者:鲍昊晟
 4  * 日期:2013/3/18
 5  */
 6 using System;
 7 using System.IO;
 8 using System.Runtime.Serialization.Formatters.Binary;
 9 
10 namespace CloneDemo
11 {
12     class Program
13     {
14         static void Main(string[] args)
15         {
16             ShallowCopy();
17             Console.WriteLine();
18             DeepCopy();
19 
20             Console.ReadKey();
21         }
22 
23         private static void ShallowCopy()
24         {
25             Console.WriteLine("浅复制示例:");
26             Person p1 = new Person() { Name = "张三", Car = new Car() { Name = "宝马" } };
27             Console.WriteLine("Name:{0},Car:{1}", p1.Name, p1.Car);
28             Console.WriteLine("浅复制并修改");
29             Person p2 = p1.MemberwiseClone() as Person;
30             p2.Name = "李四";
31             p2.Car.Name = "奔驰";
32             Console.WriteLine("Name:{0},Car:{1}", p1.Name, p1.Car);
33             Console.WriteLine("Name:{0},Car:{1}", p2.Name, p2.Car);
34         }
35 
36         private static void DeepCopy()
37         {
38             Console.WriteLine("深复制示例:");
39             Person p1 = new Person() { Name = "张三", Car = new Car() { Name = "宝马" } };
40             Console.WriteLine("Name:{0},Car:{1}", p1.Name, p1.Car);
41             Console.WriteLine("深复制并修改");
42             Person p2 = p1.Clone() as Person;
43             p2.Name = "李四";
44             p2.Car.Name = "奔驰";
45             Console.WriteLine("Name:{0},Car:{1}", p1.Name, p1.Car);
46             Console.WriteLine("Name:{0},Car:{1}", p2.Name, p2.Car);
47         }
48     }
49 
50 
51     [Serializable]
52     public class Car
53     {
54         public string Name;
55         public override string ToString()
56         {
57             return Name;
58         }
59     }
60 
61     [Serializable]
62     public class Person : ICloneable
63     {
64         public string Name;
65 
66         public Car Car;
67 
68         /// <summary>
69         /// 创建当前对象的浅表副本
70         /// </summary>
71         /// <returns></returns>
72         public new object MemberwiseClone()
73         {
74             return base.MemberwiseClone();
75         }
76 
77         #region ICloneable 成员
78         /// <summary>
79         /// 深复制
80         /// </summary>
81         /// <returns></returns>
82         public object Clone()
83         {
84             BinaryFormatter formatter = new BinaryFormatter();
85             MemoryStream stream = new MemoryStream();
86             formatter.Serialize(stream, this);
87             stream.Seek(0, SeekOrigin.Begin);
88             return formatter.Deserialize(stream);
89         }
90         #endregion
91     }
92 
93 }
原文地址:https://www.cnblogs.com/lucienbao/p/Clone.html