Consente di creare una copia dei riferimenti dell'oggetto Object corrente.
Assembly: mscorlib (in mscorlib.dll)
Protected Function MemberwiseClone As Object
protected Object MemberwiseClone()
protected:
Object^ MemberwiseClone()
member MemberwiseClone : unit -> Object
Il metodo MemberwiseClone produce una copia dei riferimenti creando un nuovo oggetto e quindi copiando i campi non static dell'oggetto corrente nel nuovo oggetto. Qualora un campo sia un tipo di valore, viene eseguita una copia bit per bit del campo. Qualora un campo sia un tipo di riferimento, viene copiato il riferimento ma non l'oggetto a cui si fa riferimento, pertanto l'oggetto originale e il rispettivo clone faranno riferimento allo stesso oggetto.
Si consideri ad esempio un oggetto denominato X che faccia riferimento agli oggetti A e B. L'oggetto B, a sua volta, fa riferimento all'oggetto C. Una copia superficiale di X crea il nuovo oggetto X2 che fa anche riferimento agli oggetti A e B. Al contrario, una copia completa di X crea un nuovo oggetto X2 che fa riferimento ai nuovi oggetti A2 e B2, che sono copie di A e B. B2, a sua volta, fa riferimento al nuovo oggetto C2 che è una copia di C. Nell'esempio viene illustrata la differenza fra un'operazione di copia completa e superficiale.
Sono disponibili numerose modalità per implementare un'operazione di copia completa se l'operazione della copia superficiale eseguito dal metodo MemberwiseClone non soddisfa le necessità. tra cui:
-
Chiamare un costruttore di classe dell'oggetto da copiare per creare un secondo oggetto con i valori di proprietà presi dal primo oggetto. Presuppone che i valori di un oggetto siano definiti completamente dal costruttore di classe.
-
Chiamare il metodo MemberwiseClone per creare una copia superficiale di un oggetto, quindi assegnare i nuovi oggetti i cui valori sono gli stessi dell'oggetto originale a qualsiasi proprietà o campi i cui valori sono tipi riferimento. Il metodo DeepCopy nell'esempio seguente illustra questo approccio.
-
Serializzare l'oggetto da copiare in modo completo, quindi ripristinare i dati serializzati in una variabile oggetto diversa.
-
Utilizzare la reflection con ricorsione per eseguire l'operazione di copia completa.
Nell'esempio riportato di seguito viene illustrato il metodo MemberwiseClone. Definisce un metodo ShallowCopy che chiama il metodo MemberwiseClone per eseguire un'operazione di copia superficiale su un oggetto Person. Definisce anche un metodo DeepCopy che esegue un'operazione di copia completa su un oggetto Person.
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
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 questo esempio, la proprietà Person.IdInfo restituisce un oggetto IdInfo. Come illustrato dall'output dall'esempio, quando un oggetto Person è duplicato chiamando il metodo MemberwiseClone, l'oggetto Person clonato è una copia indipendente dell'oggetto originale, ad eccezione che condividono lo stesso riferimento all'oggetto Person.IdInfo. Di conseguenza, la modifica che la proprietà Person.IdInfo del clone provoca la modifica della proprietà Person.IdInfo dell'oggetto originale. D'altra parte, quando viene eseguita un'operazione di copia completa, l'oggetto Person clonato, inclusa la relativa proprietà Person.IdInfo, può essere modificato senza influire sull'oggetto originale.
.NET Framework
Supportato in: 4, 3.5, 3.0, 2.0, 1.1, 1.0.NET Framework Client Profile
Supportato in: 4, 3.5 SP1Supportato in:
Windows 7, Windows Vista SP1 o versione successiva, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (componenti di base del server non supportati), Windows Server 2008 R2 (componenti di base del server supportati con SP1 o versione successiva), Windows Server 2003 SP2
.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.
Riferimenti
|
Data |
Cronologia |
Motivo |
|---|---|---|
|
Settembre 2010 |
Revisione della sezione Osservazioni e sostituzione dell'esempio. |
Commenti e suggerimenti dei clienti. |