回忆:
第一次听到“浅度复制”和“深度复制”是还没毕业去面试一家.net开发工作的时候,面试官问了没听说过的东西。其中就有“浅度复制”和“深度复制”。很显然我被那家公司pass掉了。o(╥﹏╥)oo(╥﹏╥)o
一、什么是浅度复制和深度复制
出现这两种情况是因为C#中有两种数据类型变量“值类型变量”和“引用类型变量”。浅度复制就是表面上复制了地址;深度复制就是复制了内容。对于值类型变量,复制就是全盘复制;引用类型变量,一般的复制只是浅度复制,也就是只是复制了引用地址。
浅度复制:复制本身,包含的对象只是复制引用。其包含的对象直接拿来用会产生这样的问题:比如引用类型变量(除了string类型变量)a1和a2,a2复制a1,当改变a1的时候a2也会跟着改变。
深度复制:不仅要复制本身,还要复制他所包含的对象。
二、对引用类型变量的深度复制
就拿Dictionary这个数据类型的变量来简单介绍一下深度复制吧。
1、循环原始Dictionary对象给新建的Dictionary对象进行赋值。但是这种做法虽然可以实现深度复制但是性能太差了。
2、通过序列化和反序列化来实现深度复制。具体实现方法看代码:
public class DeepCopy<Key, Value> : IDictionary<Key, Value>, ICloneable { public object Copy() { BinaryFormatter Formatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone)); MemoryStream stream = new MemoryStream(); Formatter.Serialize(stream, this); stream.Position = 0; object copyObj = Formatter.Deserialize(stream); stream.Close(); return copyObj; } }
浙公网安备 33010602011771号