Cet article a fait l'objet d'une traduction automatique. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte. Informations supplémentaires.
Traduction
Source
0 sur 1 ont trouvé cela utile - Évaluez ce sujet

Object.MemberwiseClone, méthode

Crée une copie superficielle de l'objet Object actuel.

Espace de noms :  System
Assembly :  mscorlib (dans mscorlib.dll)
protected Object MemberwiseClone()

Valeur de retour

Type : System.Object
Copie superficielle de l'objet Object actuel.

La méthode MemberwiseClone crée une copie superficielle en créant un nouvel objet puis en copiant les champs non statiques de l'objet actuel vers le nouvel objet. Si un champ est un type valeur, il est copié bit par bit. S'il s'agit d'un type référence, la référence est copiée, mais l'objet référencé ne l'est pas. Par conséquent, l'objet d'origine et son clone se réfèrent au même objet.

Par exemple, considérez un objet appelé X qui référence des objets A et B. L'objet B référence à son tour l'objet C. Une copie superficielle de X crée un nouvel objet X2 qui référence également des objets A et B. Par opposition, une copie complète de X crée un nouvel objet X2 qui fait référence aux nouveaux objets A2 et B2, qui sont des copies de A et B. B2 référence à son tour C2, qui est une copie de C. L'exemple illustre la différence entre une opération de copie superficielle et complète.

Il existe de nombreuses méthodes pour implémenter une opération de copie complète si l'opération de copie superficielle exécutée par la méthode MemberwiseClone ne répond pas à vos besoins. et notamment :

  • Appelez un constructeur de classe de l'objet à copier pour créer un deuxième objet avec les valeurs de propriété extraites du premier objet. Cela suppose que les valeurs d'un objet sont définies entièrement par son constructeur de classe.

  • Appelez la méthode MemberwiseClone pour créer une copie superficielle d'un objet, puis assignez de nouveaux objets dont les valeurs sont identiques à celles de l'objet d'origine à toute propriété ou tout champ dont les valeurs sont des types référence. La méthode DeepCopy dans l'exemple illustre cette approche.

  • Sérialisez l'objet à copier de manière complète, puis restaurez les données sérialisées dans une variable objet différente.

  • Utilisez la réflexion avec la récursivité pour exécuter l'opération de copie complète.

L'exemple de code suivant illustre la méthode MemberwiseClone. Il définit une méthode ShallowCopy qui appelle la méthode MemberwiseClone pour exécuter une opération de copie superficielle sur un objet Person. Il définit également une méthode DeepCopy qui exécute une opération de copie complète sur un objet 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


Dans cet exemple, la propriété Person.IdInfo retourne un objet IdInfo. Comme l'indique la sortie de l'exemple, lorsqu'un objet Person est cloné en appelant la méthode MemberwiseClone, l'objet Person cloné est une copie indépendante de l'objet d'origine, mais les deux objets partagent la même référence d'objet Person.IdInfo. Par conséquent, la modification de la propriété Person.IdInfo du clone modifie la propriété Person.IdInfo de l'objet d'origine. En revanche, lorsqu'une opération de copie complète est exécutée, l'objet Person cloné, notamment sa propriété Person.IdInfo, peut être modifié sans affecter l'objet d'origine.

.NET Framework

Pris en charge dans : 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Pris en charge dans : 4, 3.5 SP1

Bibliothèque de classes portable

Pris en charge dans : Bibliothèque de classes portable

.NET pour les applications du Windows Store

Pris en charge dans : Windows 8

Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (rôle principal du serveur non pris en charge), Windows Server 2008 R2 (rôle principal du serveur pris en charge avec SP1 ou version ultérieure ; Itanium non pris en charge)

Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.

Date

Historique

Motif

Septembre 2010

Section Notes révisée et exemple remplacé.

Commentaires client.

Cela vous a-t-il été utile ?
(1500 caractères restants)

Ajouts de la communauté

AJOUTER
© 2013 Microsoft. Tous droits réservés.