Dela via


Så här skriver du en kopieringskonstruktor (C#-programmeringsguide)

C#- poster tillhandahåller en kopieringskonstruktor för objekt, men för klasser måste du skriva en själv.

Viktigt!

Det kan vara svårt att skriva kopieringskonstruktorer som fungerar för alla härledda typer i en klasshierarki. Om klassen inte sealedär bör du starkt överväga att skapa en hierarki med record class typer för att använda den kompilatorsyntetiserade kopieringskonstruktorn.

Exempel

I följande exempel Person definierar klassen en kopieringskonstruktor som som argument tar en instans av Person. Värdena för egenskaperna för argumentet tilldelas egenskaperna för den nya instansen av Person. Koden innehåller en alternativ kopieringskonstruktor som skickar Name egenskaperna och Age för den instans som du vill kopiera till klassens instanskonstruktor. Klassen Person är sealed, så inga härledda typer kan deklareras som kan medföra fel genom att endast kopiera basklassen.

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

Se även