c# 关于浅拷贝和深拷贝
class Program { static void Main(string[] args) { //浅拷贝 Person p1 = new Person(); p1.Name = "张三"; p1.Mycar = new Car() { Brand = "奥迪A6" }; Person p2 = new Person(); p2.Name = p1.Name; p2.Mycar = p1.Mycar; //p1.Mycar 和 p2.Mycar 指向同一个内存地址 Console.WriteLine("p1.Mycar:" + p1.Mycar.Brand); Console.WriteLine("p2.Mycar:" + p2.Mycar.Brand); //p1.Mycar:奥迪A6 //p2.Mycar:奥迪A6 p1.Mycar.Brand = "奔驰"; Console.WriteLine("p1.Mycar:" + p1.Mycar.Brand); Console.WriteLine("p2.Mycar:" + p2.Mycar.Brand); //p1.Mycar:奔驰 //p2.Mycar:奔驰 //深拷贝 Person p3 = new Person(); p3.Name = "张三"; p3.Mycar = new Car() { Brand = "奥迪A6" }; Person p4 = new Person(); p4.Name = p3.Name; p4.Mycar = new Car() { Brand = p3.Mycar.Brand }; //这里重新创建了Car对象,p3.Mycar 和 p4.Mycar 指向两个不同内存地址 Console.WriteLine("p3.Mycar:" + p3.Mycar.Brand); Console.WriteLine("p4.Mycar:" + p4.Mycar.Brand); //p1.Mycar:奥迪A6 //p2.Mycar:奥迪A6 p3.Mycar.Brand = "奔驰"; Console.WriteLine("p3.Mycar:" + p3.Mycar.Brand); Console.WriteLine("p4.Mycar:" + p4.Mycar.Brand); //p1.Mycar:奔驰 //p2.Mycar:奥迪A6 //总结: //浅拷贝是共用一个内存地址,当p1改变p2也随着改变。 //深拷贝是完全重新创建了一个新的对象,当p1改变不会对p2任何影响。 //浅拷贝2 Person p5 = p1.QianCopy(); //深拷贝2 Person p6 = p1.ShenCopy(); Console.ReadKey(); } } [Serializable] //添加特性,标记为可序列化。 public class Person { public string Name { get; set; } public Car Mycar { get; set; } //浅拷贝--通过父类object内部方法MemberwiseClone实现 public Person QianCopy() { return (Person)this.MemberwiseClone(); } //深拷贝--通过二进制序列化 public Person ShenCopy() { //System.Runtime.Serialization.Formatters.Binary.BinaryFormatter BinaryFormatter bf = new BinaryFormatter(); MemoryStream ms = new MemoryStream(); bf.Serialize(ms, this); //序列化 ms.Position = 0; //注意一点,流的当前位置要回到开头位置 return (Person)bf.Deserialize(ms); //反序列化 } } [Serializable] public class Car { public string Brand { get; set; } }