Ten artykuł został przetłumaczony przez maszynę. Aby wyświetlić jego treść w języku angielskim, zaznacz pole wyboru Angielski. Możesz też wyświetlić angielski tekst w okienku wyskakującym, przesuwając wskaźnik myszy nad konkretny tekst”.
Tłumaczenie
Angielski

Metoda Object.MemberwiseClone — ()

.NET Framework (current version)
 

Data opublikowania: październik 2016

Tworzy płytką kopię bieżącego Object.

Przestrzeń nazw:   System
Zestaw:  mscorlib (w mscorlib.dll)

protected object MemberwiseClone()

Wartość zwracana

Type: System.Object

Płytka kopia bieżącego Object.

MemberwiseClone Metoda tworzy płytką kopię przez utworzenie nowego obiektu, a następnie skopiować niestatycznego pola bieżącego obiektu do nowego obiektu. Jeśli pole jest typ wartości, jest wykonywane kopię bitowej przez bitowej pola. Jeśli pole jest typem odwołania, odwołanie jest kopiowana, ale określony obiekt jest; w związku z tym oryginalny obiekt i jego klonowania odnoszą się do tego samego obiektu.

Na przykład rozważmy obiektu o nazwie X odwołujący się obiekty A i B. B obiektu, z kolei odwołuje się do obiektu C. Płytka kopia x tworzy nowy obiekt X2, który także odwołuje się do obiektów, A i B. Z kolei Kopia głęboka x tworzy nowy obiekt X2, który odwołuje się do nowych obiektów A2 i B2, które są kopiami A i B. B2, z kolei odwołuje się do nowego obiektu C2, będący kopią C. W przykładzie pokazano różnicę między płytka i głębokie kopiowanie.

Istnieje wiele sposobów implementacji operacji Kopia głęboka, jeśli operacja płytka kopia wykonana przez MemberwiseClone Metoda odpowiada Twoim potrzebom. Należą do nich:

  • Wywołanie konstruktora klasy obiektu, który ma być kopiowany, aby utworzyć drugi obiekt za pomocą wartości właściwości z pierwszego obiektu. Przy założeniu, że wartości obiektu całkowicie są definiowane przez jego konstruktora klasy.

  • Wywołanie MemberwiseClone Metoda do tworzenia płytkiej kopi obiektu, a następnie przypisz nowe obiekty, których wartości są takie same, jak oryginalny obiekt do dowolnej właściwości lub pól, których wartości są typy odwołań. DeepCopy To podejście pokazano w przykładzie metody.

  • Serializacji obiektu jako bezpośrednich skopiowany, a następnie przywróć serializowane dane zmiennej innego obiektu.

  • Za pomocą odbicia rekursji do wykonania operacji Kopia głęboka.

W poniższym przykładzie pokazano MemberwiseClone metody. Definiuje ShallowCopy metodę, która wywołuje MemberwiseClone metody do wykonania operacji płytka kopia na Person obiektu. Definiuje również DeepCopy metodę, która wykonuje operację Kopia głęboka na Person obiektu.

using System;

public class IdInfo
{
    public int IdNumber;

    public IdInfo(int IdNumber)
    {
        this.IdNumber = IdNumber;
    }
}

public class Person 
{
    public int Age;
    public string Name;
    public IdInfo IdInfo;

    public Person ShallowCopy()
    {
       return (Person) this.MemberwiseClone();
    }

    public Person DeepCopy()
    {
       Person other = (Person) this.MemberwiseClone();
       other.IdInfo = new IdInfo(IdInfo.IdNumber);
       other.Name = String.Copy(Name);
       return other;
    }
}

public class Example
{
    public static void Main()
    {
        // Create an instance of Person and assign values to its fields.
        Person p1 = new Person();
        p1.Age = 42;
        p1.Name = "Sam";
        p1.IdInfo = new IdInfo(6565);

        // Perform a shallow copy of p1 and assign it to p2.
        Person p2 = p1.ShallowCopy();

        // Display values of p1, p2
        Console.WriteLine("Original values of p1 and p2:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p2 instance values:");
        DisplayValues(p2);

        // Change the value of p1 properties and display the values of p1 and p2.
        p1.Age = 32;
        p1.Name = "Frank";
        p1.IdInfo.IdNumber = 7878;
        Console.WriteLine("\nValues of p1 and p2 after changes to p1:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p2 instance values:");
        DisplayValues(p2);

        // Make a deep copy of p1 and assign it to p3.
        Person p3 = p1.DeepCopy();
        // Change the members of the p1 class to new values to show the deep copy.
        p1.Name = "George";
        p1.Age = 39;
        p1.IdInfo.IdNumber = 8641;
        Console.WriteLine("\nValues of p1 and p3 after changes to p1:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p3 instance values:");
        DisplayValues(p3);
    }

    public static void DisplayValues(Person p)
    {
        Console.WriteLine("      Name: {0:s}, Age: {1:d}", p.Name, p.Age);
        Console.WriteLine("      Value: {0:d}", p.IdInfo.IdNumber);
    }
}
// The example displays the following output:
//       Original values of p1 and p2:
//          p1 instance values:
//             Name: Sam, Age: 42
//             Value: 6565
//          p2 instance values:
//             Name: Sam, Age: 42
//             Value: 6565
//       
//       Values of p1 and p2 after changes to p1:
//          p1 instance values:
//             Name: Frank, Age: 32
//             Value: 7878
//          p2 instance values:
//             Name: Sam, Age: 42
//             Value: 7878
//       
//       Values of p1 and p3 after changes to p1:
//          p1 instance values:
//             Name: George, Age: 39
//             Value: 8641
//          p3 instance values:
//             Name: Frank, Age: 32
//             Value: 7878

In this example, the Person.IdInfo property returns an IdInfo object. As the output from the example shows, when a Person object is cloned by calling the M:System.Object.MemberwiseClone method, the cloned Person object is an independent copy of the original object, except that they share the same Person.IdInfo object reference. As a result, modifying the clone's Person.IdInfo property changes the original object's Person.IdInfo property. On the other hand, when a deep copy operation is performed, the cloned Person object, including its Person.IdInfo property, can be modified without affecting the original object.

Platforma uniwersalna systemu Windows
Dostępne od 8
.NET Framework
Dostępne od 1.1
Biblioteka klas przenośnych
Obsługiwane w: przenośne platformy .NET
Silverlight
Dostępne od 2.0
Windows Phone Silverlight
Dostępne od 7.0
Windows Phone
Dostępne od 8.1
Powrót do początku
Pokaż: