Esporta (0) Stampa
Espandi tutto
Il presente articolo è stato tradotto automaticamente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.
Traduzione
Originale

Metodo Object.MemberwiseClone

Crea una copia dei riferimenti dell'oggetto Object corrente.

Spazio dei nomi:  System
Assembly:  mscorlib (in mscorlib.dll)

protected Object MemberwiseClone()

Valore restituito

Tipo: System.Object
Copia dei riferimenti dell'oggetto Object corrente.

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 seguente 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.


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.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supportato in: 4, 3.5 SP1

Libreria di classi portabile

Supportato in: Libreria di classi portabile

.NET per applicazioni Windows Store

Supportato in: Windows 8

.NET per applicazioni Windows Phone

Supportato 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 (ruoli di base del server non supportati), Windows Server 2008 R2 (ruoli di base del server supportati con SP1 o versione successiva, Itanium non supportato)

.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.

Aggiunte alla community

AGGIUNGI
Mostra:
© 2015 Microsoft