C#复制相关
时间:2015/11
实现ICloneable接口
- 在此处可以自定义对象的复制的方式,实现深复制或者浅复制;但是当类型比较复杂时,写起来比较复杂。
MemberwiseClone
- 此处实现的是浅复制,对于值类型的数据,复制后与被复制的对象互相独立,但是对于引用类型的数据,复制后,修改被复制的对象,复制的对象也会发生变化。
Serialize的方法
- 采用Serialize和Deserialize方法,可以实现对对象的深层复制。
代码
复制相关
public DemoClass DefShallowClone() { return this.MemberwiseClone() as DemoClass; } public DemoClass DefDeepClone() { MemoryStream stream = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, this); stream.Position = 0; return formatter.Deserialize(stream) as DemoClass; }
可以通过查看对象的成员变量的HashCode来观察复制的特性
DemoClass a = new DemoClass(); a.i = 10; a.iArr = new int[] {8, 9, 10 }; DemoClass b = a.Clone1(); DemoClass c = a.Clone2(); a.i = 1; a.iArr[0] = 3; Console.WriteLine(a.iArr.GetHashCode()); Console.WriteLine(b.iArr.GetHashCode()); Console.WriteLine(c.iArr.GetHashCode()); Console.WriteLine(a.i.GetHashCode()); Console.WriteLine(b.i.GetHashCode()); Console.WriteLine(c.i.GetHashCode());
对于浅复制,引用类型的HashCode不会发生变化,而深复制后,引用类型的HashCode发生变化。