回忆:

  第一次听到“浅度复制”和“深度复制”是还没毕业去面试一家.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;
        }

}

 

posted on 2019-03-14 10:06  1024M/S  阅读(139)  评论(2)    收藏  举报