Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make a copy of an object in C# [duplicate]

Tags:

c#

.net

clone

Let's say that I have a class:

class obj {   int a;   int b; } 

and then I have this code:

obj myobj = new obj(){ a=1, b=2} obj myobj2 = myobj; 

Now the above code makes a reference to the first obj. What I want is that myobj2 refers to a copy of the myobj with changes not being reflected in the original. I have searched SO and the solutions thus far seems complicated. Is there an easier way to do this. I am using .net 4.5

like image 979
Win Coder Avatar asked May 22 '13 15:05

Win Coder


People also ask

How do I copy an object in Objective C?

Two such methods are the copy and mutableCopy methods. These methods use something called the <NSCopying> Protocol. This protocol defines what must be implemented in an object in order for it to be copyable using the copy and mutableCopy methods.

What is clone () method in C?

C# | Clone() Method In C#, Clone() is a String method. It is used to clone the string object, which returns another copy of that data. In other words, it returns a reference to this instance of String. The return value will be only another view of the same data. Clone method called directly on current String instance.


2 Answers

Properties in your object are value types and you can use the shallow copy in such a situation like that:

obj myobj2 = (obj)myobj.MemberwiseClone(); 

But in other situations, like if any members are reference types, then you need Deep Copy. You can get a deep copy of an object using Serialization and Deserialization techniques with the help of BinaryFormatter class:

public static T DeepCopy<T>(T other) {     using (MemoryStream ms = new MemoryStream())     {         BinaryFormatter formatter = new BinaryFormatter();         formatter.Context = new StreamingContext(StreamingContextStates.Clone);         formatter.Serialize(ms, other);         ms.Position = 0;         return (T)formatter.Deserialize(ms);     } } 

The purpose of setting StreamingContext: We can introduce special serialization and deserialization logic to our code with the help of either implementing ISerializable interface or using built-in attributes like OnDeserialized, OnDeserializing, OnSerializing, OnSerialized. In all cases StreamingContext will be passed as an argument to the methods(and to the special constructor in case of ISerializable interface). With setting ContextState to Clone, we are just giving a hint to that method about the purpose of the serialization.

Additional Info: (you can also read this article from MSDN)

Shallow copying is 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; for 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.

Deep copy is 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, a new copy of the referred object is performed.

like image 176
Farhad Jabiyev Avatar answered Sep 20 '22 22:09

Farhad Jabiyev


You can use MemberwiseClone

obj myobj2 = (obj)myobj.MemberwiseClone(); 

The copy is a shallow copy which means the reference properties in the clone are pointing to the same values as the original object but that shouldn't be an issue in your case as the properties in obj are of value types.

If you own the source code, you can also implement ICloneable

like image 42
vc 74 Avatar answered Sep 20 '22 22:09

vc 74