public static void ShowDeepCloneByReflect() { PrototypeProduct prototype = new PrototypeProduct(); prototype.Type = new Type() { TypeId = 1 }; var prototype2 = (PrototypeProduct)prototype.DeepCloneByReflect(); prototype2.Type.TypeId = 3; Console.WriteLine(prototype.Type.TypeId); Console.WriteLine(prototype2.Type.TypeId); }
/// <summary> /// 浅拷贝 /// </summary> public static void Show() { PrototypeProduct product = new PrototypeProduct { Name = "product1", Num = 1, Type = new Type() { TypeId = 1 } }; var product2 = product.ShallowClone(); product2.Num = 2; product2.Name = "product2"; product2.Type.TypeId = 2; //值类型完全拷贝 Console.WriteLine(product.Num); //1 Console.WriteLine(product2.Num); //2 //不是说引用类型只拷贝地址吗?为什么修改了produtct2的Name值,Product1的值还是原来的呢? //引用类型拷贝地址是对的,但是字符串类型有的特殊,因为字符串类型是不可变的。修改product2的Name值相当于新创建了一个string类型的值 Console.WriteLine(product.Name); //product1 Console.WriteLine(product2.Name); //product2 //引用类型的浅拷贝,这里就体现出来了 //修改了product2的type,product1中的type也随着改变 Console.WriteLine(product.Type.TypeId); //2 Console.WriteLine(product2.Type.TypeId); //2 product2.Type = new Type() { TypeId = 3 }; //这里修改了product2中的type值,为什么product中的type没有发生改变呢? //因为product2重新创建了一个type,和product中的type指向的不是同一个堆内存空间了 //上面所提到的字符串可以参考这一条 Console.WriteLine(product.Type.TypeId); //2 Console.WriteLine(product2.Type.TypeId); //3 }