Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

Object.MemberwiseClone-Methode: ()

 

Veröffentlicht: Oktober 2016

Erstellt eine flache Kopie des aktuellen Object.

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

protected object MemberwiseClone()

Rückgabewert

Type: System.Object

Eine flache Kopie des aktuellen Object.

Die MemberwiseClone Methode erstellt eine flache Kopie durch Erstellen eines neuen Objekts, und klicken Sie dann die nicht statische Felder des aktuellen Objekts in das neue Objekt kopiert. Wenn ein Feld ein Werttyp ist, erfolgt eine Bit für Bit-Kopie des Felds. Wenn ein Feld ein Verweistyp ist, wird der Verweis kopiert, aber das referenzierte Objekt ist nicht; das ursprüngliche Objekt und dessen Klon sich daher auf das gleiche Objekt beziehen.

Angenommen Sie, ein Objekt namens X, das auf die Objekte A und B, c References-Objekt Eine flache Kopie von X erstellt neue Objekt X2, das auch Objekte A und b verweist Im Gegensatz dazu eine tiefe Kopie von X erstellt ein neues Objekt X2, die verweist auf die neuen Objekte A2 und B2, die Kopien von A und b B2 verweist wiederum auf das neue Objekt C2, also eine Kopie des c Das Beispiel veranschaulicht den Unterschied zwischen einem flachen und eine tiefe Kopie-Vorgang.

Es gibt zahlreiche Möglichkeiten, einen tiefe Kopie-Vorgang zu implementieren, wenn der flachen Kopie-durch Vorgangs die MemberwiseClone Methode Ihren Anforderungen nicht erfüllt. Hierzu gehört Folgendes:

  • Rufen Sie einen Klassenkonstruktor des Objekts kopiert werden soll, um ein zweites Objekt mit Eigenschaftswerten, die das erste Objekt entnommen zu erstellen. Dies setzt voraus, dass die Werte eines Objekts von den Klassenkonstruktor vollständig definiert werden.

  • Rufen Sie die MemberwiseClone Methode, um eine flache Kopie eines Objekts zu erstellen, und weisen Sie ihm anschließend neue Objekte, deren Werte identisch mit der ursprünglichen Objekt auf Eigenschaften oder Felder sind, deren Werte Referenztypen sind. Die DeepCopy -Methode im Beispiel veranschaulicht diese Vorgehensweise.

  • Serialisiert das Objekt, um umfassende werden kopiert, und klicken Sie dann die serialisierten Daten zu einer anderen Objektvariable wiederherstellen.

  • Mithilfe der Reflektion zum Ausführen des Vorgangs tiefe Kopie mit Rekursion.

Das folgende Beispiel veranschaulicht die MemberwiseClone Methode. Definiert eine ShallowCopy Methode, die aufgerufen der MemberwiseClone Methode zum eine flache Kopie eines Vorgangs auf ein Person Objekt. Er definiert außerdem eine DeepCopy -Methode, die eine tiefe Kopie-Operation für wird ein Person Objekt.

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.

Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 1.1
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1
Zurück zum Anfang
Anzeigen: