(0) exportieren Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

Object.MemberwiseClone-Methode

Erstellt eine flache Kopie des aktuellen Object.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)

protected Object MemberwiseClone()

Rückgabewert

Typ: System.Object
Eine flache Kopie des aktuellen Object.

Die MemberwiseClone-Methode erstellt eine flache Kopie, indem ein neues Objekt erstellt wird und anschließend die nicht statischen Felder des aktuellen Objekts in das neue Objekt kopiert werden. Wenn ein Feld ein Werttyp ist, wird das Feld bitweise kopiert. Wenn es sich bei dem Feld um einen Referenztyp handelt, wird nicht das Objekt, auf das verwiesen wird, sondern der Verweis kopiert. Daher verweisen das ursprüngliche Objekt und der Klon auf dasselbe Objekt.

Betrachten Sie beispielsweise ein Objekt X, das auf die Objekte A und B verweist. Objekt B wiederum verweist auf Objekt C. Eine flache Kopie von X erstellt neues Objekt X2, das auch auf Objekte A und B verweist. Im Gegensatz dazu erstellt eine tiefe Kopie von X ein neues Objekt X2, das auf die neuen Objekte A2 und B2 verweist, die Kopien von A und B sind. B2 verweist wiederum auf das neue Objekt C2, das ein Kopie-C ist. Im Beispiel wird der Unterschied zwischen dem Vorgang für eine flache und dem Vorgang für eine tiefe Kopie veranschaulicht.

Es gibt zahlreiche Möglichkeiten, einen Tiefenkopievorgang zu implementieren, wenn der von der MemberwiseClone-Methode ausgeführte Vorgang für flache Kopien die Anforderungen nicht erfüllt. Hierzu gehört Folgendes:

  • Rufen Sie einen Klassenkonstruktor des Objekts auf, der kopiert werden soll, um ein zweites Objekt mit vom ersten Objekt akzeptierten Eigenschaftswerten zu erstellen. Dabei wird davon ausgegangen, dass die Werte eines Objekts vollständig durch den Klassenkonstruktor definiert werden.

  • Rufen Sie die MemberwiseClone-Methode auf, um eine flache Kopie eines Objekts zu erstellen, und weisen Sie dann neue Objekte, deren Werte dem ursprünglichen Objekt entsprechen, zu Eigenschaften oder Feldern zu, deren Werte Verweistypen sind. Die DeepCopy-Methode im Beispiel veranschaulicht diesen Ansatz.

  • Serialisieren Sie das Objekt, für das eine tiefe Kopie ausgeführt werden soll, und stellen Sie dann die serialisierten Daten in einer anderen Objektvariable wieder her.

  • Verwenden Sie Reflektion mit Rekursion, um den Tiefenkopievorgang auszuführen.

Im folgenden Beispiel wird die MemberwiseClone-Methode veranschaulicht. Eine ShallowCopy-Methode wird definiert, die die MemberwiseClone-Methode aufruft, um einen Vorgang für flache Kopien auf einem Person-Objekt auszuführen. Außerdem wird eine DeepCopy-Methode definiert, die einen Vorgang für tiefe Kopien für ein Person-Objekt ausführt.


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


In diesem Beispiel gibt die Person.IdInfo-Eigenschaft ein IdInfo-Objekt zurück. Wie die Ausgabe vom Beispiel anzeigt, wenn ein Person-Objekt geklont wird, indem die MemberwiseClone-Methode aufgerufen wird, ist das geklonte Person-Objekt eine unabhängige Kopie des ursprünglichen Objekts, außer dass sie den gleichen Person.IdInfo-Objektverweis besitzen. Als Ergebnis ändert das Ändern der Person.IdInfo-Eigenschaft des Klons die Person.IdInfo-Eigenschaft des ursprünglichen Objekts. Andererseits kann, wenn ein Tiefenkopievorgang ausgeführt wird, das geklonte Person-Objekt, einschließlich seiner Person.IdInfo-Eigenschaft, geändert werden, ohne das ursprüngliche Objekt zu beeinflussen.

.NET Framework

Unterstützt in: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

Portable Klassenbibliothek

Unterstützt in: Portable Klassenbibliothek

.NET für Windows Store-Apps

Unterstützt in: Windows 8

.NET für Windows Phone-Apps

Unterstützt in: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core-Rolle wird nicht unterstützt), Windows Server 2008 R2 (Server Core-Rolle wird mit SP1 oder höher unterstützt; Itanium wird nicht unterstützt)

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft