Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deep Copy in C#

Tags:

c#

MSDN gives this example of a deep copy (http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx)

public class Person 
{
    public int Age;
    public string Name;
    public IdInfo IdInfo;

    public Person ShallowCopy()
    {
       return (Person)this.MemberwiseClone();
    }

    public Person DeepCopy()
    {
       Person other = (Person) this.MemberwiseClone(); 
       other.IdInfo = new IdInfo(this.IdInfo.IdNumber);
       return other;
    }
}

But, doesn't a new Person object have to be instantiated, and then returned? For example, is this code below acceptable/equal/inferior to the code above for performing a deep copy?

As I understand the MemberwiseClone() method, it just performs a shallow copy, i.e. copies values/references from copied object to new object. This results in a shallow copy since the memory references are equal, i.e. the references point to the same objects.

public class Person 
{
    public int Age;
    public string Name;
    public IdInfo IdInfo;

    public Person ShallowCopy()
    {
       return (Person)this.MemberwiseClone();
    }

    public Person DeepCopy()
    {
       Person other = new Person(); // difference
       other.IdInfo = new IdInfo(this.IdInfo.IdNumber);
       return other;
    }
}
like image 557
Kevin Meredith Avatar asked Dec 28 '11 04:12

Kevin Meredith


Video Answer


1 Answers

In the example that you specified, the values of Age and Name would be zero/blank.

This is due to the fact that you instantiate the Person object, but never set the values of these fields.

From Object.MemberwiseClone Method

The MemberwiseClone method creates a shallow copy by creating a new object, and then copying the nonstatic fields of the current object to the new object. If a field is a value type, a bit-by-bit copy of the field is performed. If a field is a reference type, the reference is copied but the referred object is not; therefore, the original object and its clone refer to the same object.

So as you can see, using the MemberwiseClone method, your Age/Name fields will also be copied/cloned.

like image 169
Adriaan Stander Avatar answered Sep 27 '22 16:09

Adriaan Stander