public class Person : ICloneable {
public Person(string[] names, Address address) {
public override string ToString() {
return $"{nameof(Names)}: {string.Join(" ", Names)}, {nameof(Address)}: {Address}";
return new Person(Names, (Address) new Address(Address.Street, Address.HouseNumber));
public class Address : ICloneable {
public Address(string street, int houseNumber) {
HouseNumber = houseNumber;
public override string ToString() {
return $"{nameof(Street)}: {Street}, {nameof(HouseNumber)}: {HouseNumber}";
return new Address(Street, HouseNumber);
public static void Main()
var p1 = new Person(new []{"Jonatan", "David"},
new Address("18 de julio", 754));
var p2 = (Person) p1.Clone();
p2.Names = new []{"Alguien", "más..."};