Object.MemberwiseClone Metódus
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Az aktuális Objectpéldány sekély másolatát hozza létre.
protected:
System::Object ^ MemberwiseClone();
protected object MemberwiseClone();
member this.MemberwiseClone : unit -> obj
Protected Function MemberwiseClone () As Object
Válaszok
Az aktuális Objectpéldány sekély másolata.
Példák
Az alábbi példa a metódust szemlélteti MemberwiseClone . Meghatároz egy metódust ShallowCopy , amely meghívja a MemberwiseClone metódust egy sekély másolási művelet végrehajtására egy Person objektumon. Definiál egy metódust DeepCopy is, amely mély másolási műveletet hajt végre egy Person objektumon.
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)MemberwiseClone();
}
public Person DeepCopy()
{
Person other = (Person)MemberwiseClone();
other.IdInfo = new IdInfo(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()
{
Age = 42,
Name = "Sam",
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.Age = 39;
p1.Name = "George";
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: {p.Name:s}, Age: {p.Age:d}");
Console.WriteLine($" Value: {p.IdInfo.IdNumber:d}");
}
}
/* 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
*/
open System
type IdInfo(IdNumber) =
member val IdNumber = IdNumber with get, set
type Person() =
[<DefaultValue>]
val mutable public Age: int
[<DefaultValue>]
val mutable public Name: string
[<DefaultValue>]
val mutable public IdInfo: IdInfo
member this.ShallowCopy() =
this.MemberwiseClone() :?> Person
member this.DeepCopy() =
let other = this.MemberwiseClone() :?> Person
other.IdInfo <- IdInfo this.IdInfo.IdNumber
other
let displayValues (p: Person) =
printfn $" Name: {p.Name:s}, Age: {p.Age:d}"
printfn $" Value: {p.IdInfo.IdNumber:d}"
// Create an instance of Person and assign values to its fields.
let p1 = Person()
p1.Age <- 42
p1.Name <- "Sam"
p1.IdInfo <- IdInfo 6565
// Perform a shallow copy of p1 and assign it to p2.
let p2 = p1.ShallowCopy()
// Display values of p1, p2
printfn "Original values of p1 and p2:"
printfn " p1 instance values: "
displayValues p1
printfn " 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
printfn "\nValues of p1 and p2 after changes to p1:"
printfn " p1 instance values: "
displayValues p1
printfn " p2 instance values:"
displayValues p2
// Make a deep copy of p1 and assign it to p3.
let p3 = p1.DeepCopy()
// Change the members of the p1 class to new values to show the deep copy.
p1.Age <- 39
p1.Name <- "George"
p1.IdInfo.IdNumber <- 8641
printfn "\nValues of p1 and p3 after changes to p1:"
printfn " p1 instance values: "
displayValues p1
printfn " p3 instance values:"
displayValues p3
// 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
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(MemberwiseClone(), Person)
End Function
Public Function DeepCopy() As Person
Dim other As Person = DirectCast(MemberwiseClone(), Person)
other.IdInfo = New IdInfo(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 = 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)
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.Age = 39
p1.Name = "George"
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
Ebben a példában a Person.IdInfo tulajdonság egy IdInfo objektumot ad vissza. Ahogy a példában látható, amikor egy Person objektum klónozása a MemberwiseClone metódus meghívásával történik, a klónozott Person objektum az eredeti objektum független másolata, azzal a kivételrel, hogy ugyanazzal az objektumhivatkozással Person.IdInfo rendelkeznek. Ennek eredményeképpen a klón tulajdonságának Person.IdInfo módosítása megváltoztatja az eredeti objektum tulajdonságát Person.IdInfo . Ha viszont mély másolási műveletet hajt végre, a klónozott Person objektum , beleértve annak tulajdonságát Person.IdInfo is, anélkül módosítható, hogy az hatással lenne az eredeti objektumra.
Megjegyzések
A MemberwiseClone metódus egy új objektum létrehozásával hoz létre egy sekély másolatot, majd másolja az aktuális objektum nemsztatikus mezőit az új objektumba. Ha egy mező értéktípus, a program bitenkénti másolatot készít a mezőről. Ha egy mező hivatkozástípus, akkor a rendszer átmásolja a hivatkozást, de a hivatkozott objektum nem; ezért az eredeti objektum és annak klónja ugyanarra az objektumra hivatkozik.
A sekély és a mély másolási művelet közötti különbség szemléltetéséhez fontolja meg egy X nevű objektumot, amely az A és a B objektumra hivatkozik. A B objektum viszont a C objektumra hivatkozik. Az X sekély másolata új X2 objektumot hoz létre, amely szintén az A és a B objektumra hivatkozik. Ezzel szemben az X mély másolata létrehoz egy új X2 objektumot, amely az A2 és B2 objektumra hivatkozik, amely az A és b. B2 másolata, viszont az új C2 objektumra hivatkozik, amely a C másolata.
A mély másolási művelet számos módon implementálható, ha a módszer által MemberwiseClone végrehajtott sekély másolási művelet nem felel meg az Igényeinek. Ezek közé tartoznak a következők:
- Hívja meg a másolandó objektum osztálykonstruktorát, hogy hozzon létre egy második objektumot az első objektumból vett tulajdonságértékekkel. Ez feltételezi, hogy egy objektum értékeit teljes mértékben az osztálykonstruktor határozza meg.
- Hívja meg a MemberwiseClone metódust, hogy hozzon létre egy objektum sekély másolatát, majd rendeljen hozzá olyan új objektumokat, amelyek értékei megegyeznek az eredeti objektuméval minden olyan tulajdonsághoz vagy mezőhöz, amelynek értékei hivatkozástípusok. A
DeepCopypéldában szereplő módszer ezt a megközelítést szemlélteti. - Szerializálja az objektumot a mélymásoláshoz, majd állítsa vissza a szerializált adatokat egy másik objektumváltozóra.
- A mély másolási művelet végrehajtásához használja a tükrözést rekurzióval.