public class Address : ICloneable
public string City { get; set; }
public string Country { get; set; }
return new Address { City = this.City, Country = this.Country };
public class Person : ICloneable
public string Name { get; set; }
public Address Address { get; set; }
return new Person { Name = this.Name, Address = (Address)this.Address.Clone() };
public static void Main()
Address address = new Address { City = "New York", Country = "USA" };
Person person1 = new Person { Name = "John", Address = address };
Person person2 = (Person)person1.Clone();
Console.WriteLine("Person1 Name: {0}, City: {1}, Country: {2}", person1.Name, person1.Address.City, person1.Address.Country);
Console.WriteLine("Person2 Name: {0}, City: {1}, Country: {2}", person2.Name, person2.Address.City, person2.Address.Country);
person1.Address.City = "Los Angeles";
Console.WriteLine("Person1 Name: {0}, City: {1}, Country: {2}", person1.Name, person1.Address.City, person1.Address.Country);
Console.WriteLine("Person2 Name: {0}, City: {1}, Country: {2}", person2.Name, person2.Address.City, person2.Address.Country);
Console.WriteLine(Object.ReferenceEquals(person1, person2));