Csharp/CSharp Tutorial/Class/MemberwiseClone
Create a clone using the Object.MemberwiseClone method because the Employee class contains only string and value types
<source lang="csharp">using System; using System.Text; using System.Collections.Generic; public class Employee : ICloneable {
public string Name; public string Title; public int Age; public Employee(string name, string title, int age) { Name = name; Title = title; Age = age; } public object Clone() { return MemberwiseClone(); } public override string ToString() { return string.Format("{0} ({1}) - Age {2}", Name, Title, Age); }
} public class MainClass {
public static void Main() { Employee em = new Employee("A", "AA", 4); Employee cloneEmployee = (Employee)em.Clone(); Console.WriteLine("Original Employee:"); Console.WriteLine(em); Console.WriteLine("Clone Employee:"); Console.WriteLine(cloneEmployee); Console.WriteLine("*** Make a change to original employee ***"); em.Name = "L"; em.Title = "M"; em.Age = 4; Console.WriteLine("Original Employee:"); Console.WriteLine(em); Console.WriteLine("Clone Employee:"); Console.WriteLine(cloneEmployee); }
}</source>
Original Employee: A (AA) - Age 4 Clone Employee: A (AA) - Age 4 *** Make a change to original employee *** Original Employee: L (M) - Age 4 Clone Employee: A (AA) - Age 4
Perform a memberwise clone of myEmployee using the Employee.Copy() method
<source lang="csharp">using System; public class Employee {
public string firstName; public string lastName; public Employee(string firstName, string lastName) { this.firstName = firstName; this.lastName = lastName; } public void Display() { Console.WriteLine("firstName = " + firstName); Console.WriteLine("lastName = " + lastName); } public static Employee Copy(Employee Employee) { return (Employee) Employee.MemberwiseClone(); }
}
class MainClass {
public static void Main() { Console.WriteLine("Creating Employee objects"); Employee myEmployee = new Employee("A", "M"); Employee myOtherEmployee = new Employee("B", "N"); Console.WriteLine("myEmployee details:"); myEmployee.Display(); Console.WriteLine("myOtherEmployee details:"); myOtherEmployee.Display();
Console.WriteLine("Performing a memberwise clone of myEmployee to myOldEmployee"); Employee myOldEmployee = Employee.Copy(myEmployee); Console.WriteLine("myOldEmployee details:"); myOldEmployee.Display(); }
}</source>
Creating Employee objects myEmployee details: firstName = A lastName = M myOtherEmployee details: firstName = B lastName = N Performing a memberwise clone of myEmployee to myOldEmployee myOldEmployee details: firstName = A lastName = M
Use MemberwiseClone method to clone object
<source lang="csharp">using System; class MyValue {
public MyValue(int count) { this.count = count; } public int count;
} class MyObject {
public MyObject(int count) { this.contained = new MyValue(count); } public MyObject Clone() { Console.WriteLine("Clone"); return((MyObject) MemberwiseClone()); } public MyValue contained;
} class MainClass {
public static void Main() { MyObject my = new MyObject(3); MyObject myClone = my.Clone(); Console.WriteLine("Values: {0} {1}", my.contained.count, myClone.contained.count); myClone.contained.count = 1; Console.WriteLine("Values: {0} {1}", my.contained.count, myClone.contained.count); }
}</source>
Clone Values: 3 3 Values: 1 1