C#深拷贝和浅拷贝

119 阅读1分钟

深拷贝指在拷贝一个对象时,不仅把对象的引用复制了,还复制了对象的引用的值。 看一个简单例子: 我们把source赋值给copy1,当我们把copy1的Name设为Bala时,会发现source.Nameye也会是Bala,因为这种操作方式是浅拷贝,source和copy1指向的是同一个内存空间。

public class A
{
    public string Name { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        A source = new A() { Name = "Apple"};
        A copy1 = source;
        copy1.Name="Bala";
    }
}

与之相对应的就叫做深拷贝,这种拷贝方式相当于创建了2块独立的内存空间,copy2不会影响到source(感觉跟new一个新对象差不多,但这种方式减少代码量)。最终,source.Name还是Apple,copy2.Name的值是Bala2,两边操作互不影响。

public class A
{
    public string Name { get; set; }
    public A DeepClone()
    {
      using (Stream objStream = new MemoryStream())
      {
          IFormatter formatter = new BinaryFormatter();
          formatter.Serialize(objStream, this);
          objStream.Seek(0, SeekOrigin.Begin);
          return formatter.Deserialize(objStream) as A;
      }
    }
}
class Program
{
    static void Main(string[] args)
    {
        A source = new A() { Name = "Apple"};
        A copy2 = source.DeepClone();
        copy2.Name="Bala2";
    }
}