拷贝:对象一定有一个副本
深拷:针对所有级别的类型创建独立的副本
浅拷:针对本类型的实例的属性成员进行复制,对象中不包含引用类型成员(除字符串以外) 没有浅拷与深拷之分
案例:
namespace 深拷贝与浅拷贝 { [Serializable] public class MyClass : ICloneable //实现改接口可以很方便的实现浅拷贝 { public string name; public Car car; public object Clone() { return MemberwiseClone();//这个是object的受保护的方法,专门创建浅拷贝 } /// <summary> ///拷贝方法 /// </summary> /// <param name="flag">flag为true是浅拷贝,否则为深拷贝</param> /// <returns>MyClass</returns> public MyClass Copy(bool flag) { if (flag) { return Clone() as MyClass; //浅拷贝 } else { //创建内存流 using (MemoryStream ms = new MemoryStream()) { //创建序列化与反序列化对象 BinaryFormatter bf = new BinaryFormatter(); //序列化当前对象 bf.Serialize(ms,this); ms.Position = 0;//将流的当前位置设置成开始位置 //反序列化当前对象 return bf.Deserialize(ms) as MyClass; } } } } }
namespace 深拷贝与浅拷贝 { [Serializable] public class Car { public string carname; } }
namespace 深拷贝与浅拷贝 { class Program { static void Main(string[] args) { MyClass m1 = new MyClass(); m1.name = "dongqing"; m1.car = new Car() { carname = "奥迪A6" }; //浅拷贝 MyClass m2 = m1.Copy(true); //深拷贝 MyClass m3 = m1.Copy(false); } } }
运行断点调试:
我们可以看到浅拷贝的m2的car字段的地址和m1对象的car地址一样(这是浅拷贝的),而m3的car字段的地址和m1对象的car地址不一样,说明这是深拷贝的