Procedura: scrivere un costruttore di copia (Guida per programmatori C#)
I record C# forniscono un costruttore di copia per gli oggetti, ma per le classi è necessario scriverne uno manualmente.
Importante
La scrittura di costruttori di copia che funzionano per tutti i tipi derivati in una gerarchia di classi può essere difficile. Se la classe non è sealed
, è consigliabile prendere in considerazione la creazione di una gerarchia di tipi record class
per usare il costruttore di copia sintetizzato dal compilatore.
Esempio
Nell'esempio seguente, nella classe Person
viene definito un costruttore di copia che accetta come argomento un'istanza di Person
. I valori delle proprietà dell'argomento vengono assegnati alle proprietà della nuova istanza di Person
. Il codice contiene un costruttore di copia alternativo che invia le proprietà Name
e Age
dell'istanza che si vuole copiare nel costruttore di istanza della classe. La classe Person
è sealed
, quindi non è possibile dichiarare tipi derivati che potrebbero introdurre errori copiando solo la classe di base.
public sealed class Person
{
// Copy constructor.
public Person(Person previousPerson)
{
Name = previousPerson.Name;
Age = previousPerson.Age;
}
//// Alternate copy constructor calls the instance constructor.
//public Person(Person previousPerson)
// : this(previousPerson.Name, previousPerson.Age)
//{
//}
// Instance constructor.
public Person(string name, int age)
{
Name = name;
Age = age;
}
public int Age { get; set; }
public string Name { get; set; }
public string Details()
{
return Name + " is " + Age.ToString();
}
}
class TestPerson
{
static void Main()
{
// Create a Person object by using the instance constructor.
Person person1 = new Person("George", 40);
// Create another Person object, copying person1.
Person person2 = new Person(person1);
// Change each person's age.
person1.Age = 39;
person2.Age = 41;
// Change person2's name.
person2.Name = "Charles";
// Show details to verify that the name and age fields are distinct.
Console.WriteLine(person1.Details());
Console.WriteLine(person2.Details());
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output:
// George is 39
// Charles is 41