Cloning C# objects is one of those things that appears easy but is actually quite complicated with many "gotchas." This article describes the most common ways to clone a C# object.

Shallow vs. Deep Cloning

There are two types of object cloning: shallow and deep. A shallow clone copies the references but not the referenced objects. A deep clone copies the referenced objects as well.

Hence, a reference in the original object and the same reference in a shallow-cloned object both point to the same object. Whereas a deep-cloned object contains a copy of everything directly or indirectly referenced by the object. See wikipedia for a detailed explanation.

Object Clone

ICloneable Interface

The ICloneable interface contains a single Clone method, which is used to create a copy of the current object.

public interface ICloneable
{
object Clone();
}

The problem with ICloneable is that the Clone method does not explicitly specify whether it is performing a shallow or deep copy, so callers can never be sure. Hence, there is some discussion about making ICloneable obsolete in the .NET Framework. The MSDN documentation seems to hint that Clone should perform a deep copy, but it is never explicitly stated:

The ICloneable interface contains one member, Clone, which is intended to support cloning beyond that supplied by MemberWiseClone… The MemberwiseClone method creates a shallow copy…

Type-Safe Clone

Another disadvantage of ICloneable is that the Clone method returns an object, hence every Clone call requires a cast:

Person joe = new Person();
joe.Name = "Joe Smith";
Person joeClone = (Person)joe.Clone();

One way to avoid the cast is to provide your own type-safe Clone method. Note that you must still provide the ICloneable.Clone method to satisfy the ICloneable interface:

public class Person : ICloneable
{
public string Name;
object ICloneable.Clone()
{
return this.Clone();
}
public Person Clone()
{
return (Person)this.MemberwiseClone();
}
}

Clone Options

Following are some of the more common approaches to clone a C# object:

1. Clone Manually

One way to guarantee that an object will be cloned exactly how you want it is to manually clone every field in the object. The disadvantage to this method is it's tedious and error prone: if you add or change a field in the class, chances are you will forget to update the Clone method. Note that care must be taken to avoid an infinite loop when cloning referenced objects that may refer back to the original object. Here is a simple example that performs a deep copy:

public class Person : ICloneable
{
public string Name;
public Person Spouse;
public object Clone()
{
Person p = new Person();
p.Name = this.Name;
if (this.Spouse != null)
p.Spouse = (Person)this.Spouse.Clone();
return p;
}
}

2. Clone with MemberwiseClone

MemberwiseClone is a protected method in the Object class that creates a shallow copy by creating a new object, and then copying the nonstatic fields of the current object to the new object. For value-type fields, this performs a bit-by-bit copy. For reference-type fields, the reference is copied but the referred object is not; therefore, the original object and its clone refer to the same object. Note this works for all derived classes, and hence you only need to define the Clone method once in the base class. Here is a simple example:

public class Person : ICloneable
{
public string Name;
public Person Spouse;
public object Clone()
{
return this.MemberwiseClone();
}
}

3. Clone with Reflection

Cloning by Reflection uses Activator.CreateInstance to create a new object of the same type, then performs a shallow copy of each field using Reflection. The advantage of this method is it's automated and does not need to be adjusted when members are added or removed from the object. Also, it can be written to provide a deep copy. The disadvantage is it uses Reflection, which is slower and not allowed in partial trust environments. Sample code

4. Clone with Serialization

One of the easiest ways to clone an object is to serialize it and immediately deserialize it into a new object. Like the Reflection approach, the Serialization approach is automated and does not need to be adjusted when members are added or removed from the object. The disadvantage is that serialization can be slower than other methods including Reflection, and all cloned and referenced objects must be marked Serializable. Also, depending on what type of serialization you use (XML, Soap, Binary), private members may not be cloned as desired. Sample code here and here and here.

5. Clone with IL

A fringe solution is to use IL (Intermediate Language) to clone objects. This approach creates a DynamicMethod, gets the ILGenerator, emits code in the method, compiles it to a delegate, and executes the delegate. The delegate is cached so that the IL is generated only the first time and not for each subsequent cloning. Although this approach is faster than Reflection, it is difficult to understand and maintain. Sample code

6. Clone with Extension Methods

Havard Stranden created a custom cloning framework using extension methods. The framework creates a deep copy of an object and all referenced objects, no matter how complex the object graph is. The disadvantage is this is a custom framework with no source code (Update: source code now included, see comment below), and it cannot copy objects created from private classes without parameterless constructors. Another problem, which is common to all automated deep copy methods, is that deep copying often requires intelligence to handle special cases (such as unmanaged resources) that cannot be easily automated.

16

View comments

  1. Simply Great stuff, Short and Precise

    ReplyDelete
  2. Great article, thanks. BTW, I think your "Clone Manually" example will lead to an infinite recursion, if P1 and P2 are spouses: P1.clone -> P2.clone -> P1.clone -> ...

    ReplyDelete
  3. Thanks for this overview. Great introduction into this subject. A time saver.

    ReplyDelete
  4. Very nice article. I have always needed this comprehensive introduction to cloning.

    ReplyDelete
  5. Thank you.Perfect article.

    ReplyDelete
  6. I just checked: C# does offer the correct solution for the type safety problem: http://msdn.microsoft.com/en-us/library/dd233060(v=vs.110).aspx

    Also, the iCloneable interface should not define if the implementers are cloned shallow or not. That is an implementation detail which should be encapsulated. Generally it's not even that clear cut: Some attributes are sensible to be cloned shallowly and others deeply, it's the class's author's decision which to apply where.

    ReplyDelete
  7. Very nice article - great and yet short introduction.

    I add two more links for well working cloning codes:
    1. Cloning by Reflection
    2. Cloning by Expression Trees

    The second link has beside the code also performance comparison of cloning by Serialization, Reflection and Expression Trees.

    ReplyDelete
  8. Your style is unique in comparison to other folks I have read stuff from.
    Many thanks for posting when you have the opportunity, Guess I will just bookmark this blog.wondershare filmora crack

    ReplyDelete
  9. Camtasia!
    PC Full Crack!
    I am very thankful for the effort put on by you, to help us, Thank you so much for the post it is very helpful, keep posting such type of Article.

    ReplyDelete
  10. Need for Speed: Undercover For Pc Download Game
    Thepcgameshere.com
    Need for Speed: Undercover For Pc Download is a supercar speediest car racing game. This game has an adventure for users who like to play it.

    ReplyDelete
  11. Ashes Cricket Game
    Ashes Cricket Game Download is the powerfully authorized computer game. Therefore, It cricket’s most prominent conflict.

    ReplyDelete
  12. MediaMonkey Gold
    https://windowsactivation.net/
    MediaMonkeyGold Serial Key is an excellent all-round program for recording and organising music and supports all popular audio formats.

    ReplyDelete
  13. In 2021, the world777 online gaming audience in India grew 28 per cent to reach Rs 101 billion or crore ( roughlyUS$1.3 billion), according to a report published in March 2022 by EY, a global professional services company, and the Federation of Indian Chambers of Commerce & Industry (FICCI).

    ReplyDelete
Insert/Update Image Through SQL Query
Insert/Update Image Through SQL Query
What's New in 4.5
Free Online E-Books
Free Online E-Books
Using LINQ to SQL
Using LINQ to SQL
1
Currency Format for Server Side Controls
Currency Format for Server Side Controls
Java Script Debugger in Internet Explorer 8
1
New Features of Visual Studio 2008 for .NET Professionals
Microsoft Chart Controls for Microsoft .NET Framework 3.5
Microsoft Chart Controls for Microsoft .NET Framework 3.5
1
Get Max Number On String
Get Max Number On String
To disable autorecovery in .net
To disable autorecovery in .net
Generate Serial No. in SQL
Generate Serial No. in SQL
C# Basic Questions
C# Basic Questions
Asp.net Questions
Asp.net Questions
Multiple Duplicate Keys in App.Config Files
Multiple Duplicate Keys in App.Config Files
Inserting Multiple Record in SQL
Inserting Multiple Record in SQL
Label Formatting
Label Formatting
Delegates in .NET
Delegates in .NET
Passing Values between ASP.NET Web Forms
Passing Values between ASP.NET Web Forms
10 of the Biggest Platform Development Mistakes
10 of the Biggest Platform Development Mistakes
What's New in MSDN Code Gallery?
What's New in MSDN Code Gallery?
How technology changes us......
How technology changes us......
SQL Server Function to Determine a Leap Year
SQL Server Function to Determine a Leap Year
Improve Web Application Performance
Improve Web Application Performance
1
Hghlight Datagrid or GridView Row on Mouse Over
Hghlight Datagrid or GridView Row on Mouse Over
1
ATLAS FilteredTextBox Extender
ATLAS FilteredTextBox Extender
Introduction to Silverlight
Introduction to Silverlight
JavaScript with ASP.NET 2.0 Pages
JavaScript with ASP.NET 2.0 Pages
1
.NET Framework 3.5 New Features
.NET Framework 3.5 New Features
C# Object Clone Wars
C# Object Clone Wars
16
Google to Deliver GWT 1.5
Google to Deliver GWT 1.5
What's New in the .NET Framework 3.5
What's New in the .NET Framework 3.5
1
SQL Server 2005 SP1 Users Face Vista, Longhorn Glitches
SQL Server 2005 SP1 Users Face Vista, Longhorn Glitches
C# Class Wrapping
C# Class Wrapping
Great Computer Programming Quotes
Great Computer Programming Quotes
Windows Communication Foundation Service (WCF )
Windows Communication Foundation Service (WCF )
10 Things You Can Do To Motivate Your Team
10 Things You Can Do To Motivate Your Team
1
"A Programmer is a device for turning coffee into code"
"A Programmer is a device for turning coffee into code"
Power Toys for .NET Compact Framework 3.5 have been released
Power Toys for .NET Compact Framework 3.5 have been released
1
Microsoft Windows XP Service Pack 3 Release
Microsoft Windows XP Service Pack 3 Release
Windows 7( Vienna)
Windows 7( Vienna)
C# String Tips
C# String Tips
Visual Studio 2008 and .NET Framework 3.5 Service Pack 1 Beta
Visual Studio 2008 and .NET Framework 3.5 Service Pack 1 Beta
SQL Prompt Pro - now with customizable code layout
SQL Prompt Pro - now with customizable code layout
Convert .NET data types using Parse and TryParse
Convert .NET data types using Parse and TryParse
C# Free Video Programming Tutorials
C# Free Video Programming Tutorials
Windows Workflow Foundation Web Workflow Approvals Starter Kit
Windows Workflow Foundation Web Workflow Approvals Starter Kit
10 Things You Should Know About Microsoft's Silverlight
10 Things You Should Know About Microsoft's Silverlight
60 More AJAX- and Javascript Solutions For Professional Coding
60 More AJAX- and Javascript Solutions For Professional Coding
.NET 3.5 Enhancements Training Kit
.NET 3.5 Enhancements Training Kit
20 Tips to Improve ASP.net Application Performance
20 Tips to Improve ASP.net Application Performance
How to Videos (Visual Studio 2008)
How to Videos (Visual Studio 2008)
Looking For Cool Technology Toys?
Looking For Cool Technology Toys?
Subscribe
Subscribe
Favorite Links
Blog Archive
About Me
Loading
Dynamic Views theme. Powered by Blogger. Report Abuse.