(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)

'Declaration
Protected Function MemberwiseClone As Object

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.


Public Class IdInfo
    Public IdNumber As Integer

    Public Sub New(IdNumber As Integer)
        Me.IdNumber = IdNumber
    End Sub
End Class

Public Class Person 
    Public Age As Integer
    Public Name As String
    Public IdInfo As IdInfo

    Public Function ShallowCopy() As Person
       Return DirectCast(Me.MemberwiseClone(), Person)
    End Function

    Public Function DeepCopy() As Person
       Dim other As Person = DirectCast(Me.MemberwiseClone(), Person) 
       other.IdInfo = New IdInfo(Me.IdInfo.IdNumber)
       Return other
    End Function
End Class

Module Example
   Public Sub Main()
        ' Create an instance of Person and assign values to its fields.
        Dim p1 As New Person()
        p1.Age = 42
        p1.Name = "Sam"
        p1.IdInfo = New IdInfo(6565)

        ' Perform a shallow copy of p1 and assign it to p2.
        Dim p2 As Person = DirectCast(p1.ShallowCopy(), Person)

        ' 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)
        Console.WriteLine()

        ' 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("Values of p1 and p2 after changes to p1:")
        Console.WriteLine("   p1 instance values: ")
        DisplayValues(p1)
        Console.WriteLine("   p2 instance values:")
        DisplayValues(p2)
        Console.WriteLine()

        ' Make a deep copy of p1 and assign it to p3.
        Dim p3 As Person = 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("Values of p1 and p3 after changes to p1:")
        Console.WriteLine("   p1 instance values: ")
        DisplayValues(p1)
        Console.WriteLine("   p3 instance values:")
        DisplayValues(p3)
   End Sub

    Public Sub DisplayValues(p As Person)
        Console.WriteLine("      Name: {0:s}, Age: {1:d}", p.Name, p.Age)
        Console.WriteLine("      Value: {0:d}", p.IdInfo.IdNumber)
    End Sub
End Module
' The example displays the following output:
'       Original values of m1 and m2:
'          m1 instance values:
'             Name: Sam, Age: 42
'             Value: 6565
'          m2 instance values:
'             Name: Sam, Age: 42
'             Value: 6565
'       
'       Values of m1 and m2 after changes to m1:
'          m1 instance values:
'             Name: Frank, Age: 32
'             Value: 7878
'          m2 instance values:
'             Name: Sam, Age: 42
'             Value: 7878
'       
'       Values of m1 and m3 after changes to m1:
'          m1 instance values:
'             Name: George, Age: 39
'             Value: 8641
'          m3 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