浅拷贝和深拷贝(Shallow and Deep Object Copying)

时间:2022-10-28 19:52:18

参考地址:http://www.codeproject.com/Articles/36067/Shallow-and-Deep-Object-Copying

浅复制:复制一个对象的时候,仅仅复制原始对象中所有的非静态类型成员和所有的引用类型成员的引用。(新对象和原对象将共享所有引用类型成员的实际对象)

深复制:复制一个对象的时候,不仅复制所有非静态类型成员,还要复制所有引用类型成员的实际对象

 

深拷贝与浅拷贝不同的是对于引用拷贝的处理,深拷贝将会在新对象中创建和原是对象中对应值类型的字段并且赋值。浅拷贝不会创建新引用类型,会返回相同的类 型引用。深拷贝会重新创建新对象,返回新对象的引用字。

 

protected class MyClass
{
   public int i;
   public int j;
   public string message;
}
private void Test()
{
   MyClass mc1;
   MyClass mc2;
   mc1 = new MyClass();
   mc1.i = 5;
   mc1.j = 10;
   mc1.message = "Hello, World!";

   // Shallow copy
   mc2 = new MyClass();
   mc2.i = mc1.i;
   mc2.j = mc1.j;
   mc2.message = mc1.message;

   // Deep copy
   mc2 = new MyClass();
   mc2.i = mc1.i;
   mc2.j = mc1.j;
   mc2.message = String.Copy(mc1.message);
}

  

浅拷贝并没什么特别的。它只是分配每个成员从一个对象到另一个。价值成员,深复制使用相同的代码。然而,对于一个引用成员、消息的代码必须创建一个字符串数据的副本。

注意添加步骤将被要求执行一个深拷贝对象,包括引用成员对其他对象的引用,例如类成员,数组等。

protected class MyClass : ICloneable
{
    public int i;
    public int j;
    public string message;
    public object Clone()
    {
        return MemberwiseClone();
    }
}

private void Test()
{
    MyClass mc1 = new MyClass();
    mc1.i = 5;
    mc1.j = 10;
    mc1.message = "Hello, World!";

    // Shallow copy
    MyClass mc2 = (MyClass)mc1.Clone();
}

深拷贝

protected class MyClass : ICloneable
{
    public int i;
    public int j;
    public string message;
    public object Clone()
    {
        MyClass mc = new MyClass();
        mc.i = i;
        mc.j = j;
        if (message != null)
            mc.message = String.Copy(message);
        return mc;
    }
}

private void Test()
{
    MyClass mc1 = new MyClass();
    mc1.i = 5;
    mc1.j = 10;
    mc1.message = "Hello, World!";

    // Deep copy
    MyClass mc2 = (MyClass)mc1.Clone();
}