Eksportuj (0) Drukuj
Rozwiń wszystko
Ten artykuł był przetłumaczony komputerowo. Oryginalny tekst zobaczysz, umieszczając wskaźnik myszy nad zdaniami w artykule. Więcej informacji.
Tłumaczenie
Oryginał

Metoda Object.MemberwiseClone —

.NET Framework 4.5

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

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

protected Object MemberwiseClone()

Wartość zwracana

Typ: System.Object
Skrócona kopię bieżącego Object.

MemberwiseClone Metoda tworzy kopię płytkie tworzenia nowego obiektu, a następnie kopiując niestatycznego pola bieżącego obiektu do nowego obiektu. Jeśli pole jest typu wartości, odbywa się kopii bit przez bit pola. Czy pole Typ odwołania, odwołanie jest kopiowana, ale określony obiekt nie jest; w związku z tym oryginalny obiekt i jego imitacja odnoszą się do tego samego obiektu.

Rozważmy na przykład obiekt o nazwie X, który odwołuje się do obiektów, A i B. Z kolei obiekt B, odwołania do obiektu C. Kopii shallow X tworzy nowy obiekt X 2, który również odwołuje się do obiektów, A i B. Natomiast kopię głębokie X tworzy nowy obiekt X 2 odwołujący 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. Przykład ilustruje różnicę między płytkie i głębokie kopiowanie.

Istnieje wiele sposobów do wykonania operacji głębokiej kopii, jeśli operacja kopiowania płytkie wykonywane przez MemberwiseClone metoda nie spełnia Twoich potrzeb. Obbejmują następujące:

  • Wywołanie konstruktora klasy obiektu do skopiowania do utworzenia drugiego obiektu z wartości właściwości z pierwszego obiektu. Przy założeniu, że wartości obiektu są całkowicie zdefiniowane przez jego konstruktora klasy.

  • Wywołanie MemberwiseClone metodę utworzenie kopii shallow obiektu, a następnie przypisz nowe obiekty, których wartości są takie same jak oryginalny obiekt do żadnych właściwości ani pól, których wartości są typy odwołań. DeepCopy Metoda w przykładzie ilustruje to podejście.

  • Serializacji obiektu będzie głęboka kopiowane, a następnie przywrócić dane serializowane zmiennej innego obiektu.

  • Za pomocą odbicie rekursji można wykonać operację kopiowania głębokie.

Poniższy przykład ilustruje MemberwiseClone metody. Definiuje on ShallowCopy metoda, która wywołuje MemberwiseClone metoda, aby wykonać operację kopiowania płytkie na Person obiektu. Niniejsza dyrektywa definiuje również DeepCopy metoda, która wykonuje operację kopiowania głęboki 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(this.IdInfo.IdNumber);
       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 = (Person) 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


W tym przykładzie Person.IdInfo właściwość zwraca IdInfo obiektu. Jako dane wyjściowe w przykładzie pokazano kiedy Person obiekt został sklonowany, wywołując MemberwiseClone metoda, sklonowany Person obiekt jest osobną kopię obiektu oryginalnego, chyba że mają one ten sam Person.IdInfo obiekt odniesienia. W rezultacie, modyfikowanie klon Person.IdInfo oryginalny obiekt zmienia właściwość Person.IdInfo właściwości. Z drugiej strony, kiedy głębokie kopiowanie operacji jest wykonywana, sklonowany Person obiektu, łącznie z jej Person.IdInfo właściwość, mogą być modyfikowane bez wpływu na oryginalny obiekt.

.NET Framework

Obsługiwane w: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Obsługiwane w: 4, 3.5 z dodatkiem SP1

Portable Class Library

Obsługiwane w: Portable Class Library

.NET dla aplikacji do sklepu Windows Store

Obsługiwane w: Windows 8

.NET dla aplikacji dla Windows Phone

Obsługiwane w: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 z dodatkiem R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista z dodatkiem SP2, Windows Server 2008 (instalacja roli Server Core jest nieobsługiwana), Windows Server 2008 R2 (instalacja roli Server Core jest obsługiwana, gdy jest zainstalowany dodatek SP1 lub nowszy; procesory Itanium nie są obsługiwane)

Program .NET Framework nie obsługuje wszystkich wersji każdej platformy. Aby uzyskać listę wszystkich obsługiwanych wersji, zobacz Wymagania systemowe programu .NET Framework.

Zawartość społeczności

Dodaj
Pokaż:
© 2014 Microsoft