Exportar (0) Imprimir
Expandir Tudo
Este artigo foi traduzido por máquina. Coloque o ponteiro do mouse sobre as frases do artigo para ver o texto original. Mais informações.
Tradução
Original

Método Object.MemberwiseClone

Cria uma cópia superficial do Object atual.

Namespace:  System
Assembly:  mscorlib (em mscorlib.dll)

protected Object MemberwiseClone()

Valor de retorno

Tipo: System.Object
Uma cópia superficial de Objectatual.

O método de MemberwiseClone cria uma cópia superficial criando um novo objeto, e copiando os campos não estática do objeto atual para o novo objeto. Se um campo é um tipo valorado, uma cópia bit a bit do campo será executada. Se um campo é um tipo de referência, a referência será copiada mas o objeto referenciado não for; em virtude disso, o objeto original e o clone fazem referência ao mesmo objeto.

Por exemplo, considere um objeto chamado X que faz referência a objetos A e B. O objeto B, por sua vez, objeto C 2.0 referências. Uma cópia superficial X cria o novo objeto X2 que também faz referência a objetos A e B. Por outro lado, uma cópia de profundidade de X cria um novo objeto x 2 que faz referência os novos objetos A2 e B2, que são cópias de um e B. B2, por sua vez, faz referência ao novo objeto C2, que é uma cópia de C 2.0. O exemplo a seguir ilustra a diferença entre uma operação de cópia superficial e profundamente.

Há várias formas de implementar uma operação de cópia em profundidade se a operação de cópia superficial executada pelo método de MemberwiseClone não atende às suas necessidades. Eles incluem o seguinte:

  • Chame um construtor de classe do objeto a ser copiado para criar um segundo objeto com os valores de propriedade obtido do primeiro objeto. Isso pressupõe que os valores de um objeto são definidos completamente pelo construtor de classe.

  • Chame o método de MemberwiseClone para criar uma cópia superficial de um objeto, e depois atribuir novos objetos cujos valores são os mesmos do objeto original para algumas propriedades ou os campos cujos valores são tipos de referência. O método de DeepCopy no exemplo a seguir ilustra essa abordagem.

  • Serializar o objeto a ser copiado de profundidade, e depois restaure os dados serializados a uma variável de objeto diferente.

  • Use a reflexão com a recursão para executar a operação de cópia em profundidade.

O exemplo a seguir ilustra o método de MemberwiseClone . Define um método de ShallowCopy que chama o método de MemberwiseClone para executar uma operação de cópia superficial em um objeto de Person . Também define um método de DeepCopy que executa uma operação de cópia em profundidade em um objeto de 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


Neste exemplo, a propriedade de Person.IdInfo retorna um objeto de IdInfo . Como a saída de exemplo mostram, quando um objeto de Person clonado está chamando o método de MemberwiseClone , o objeto clonado de Person é uma cópia independente do objeto original, exceto que compartilham a mesma referência de objeto de Person.IdInfo . No resultado, altere a propriedade de Person.IdInfo de clonagem altera a propriedade original de Person.IdInfo do objeto. Por outro lado, quando uma operação de cópia em profundidade é executada, o objeto clonado de Person , inclusive sua propriedade de Person.IdInfo , pode ser alterado sem afetar o objeto original.

.NET Framework

Com suporte em: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Com suporte em: 4, 3.5 SP1

Biblioteca de Classes Portátil

Com suporte em: Biblioteca de Classes Portátil

.NET para aplicativos da Windows Store

Com suporte em: Windows 8

.NET para aplicativos do Windows Phone

Com suporte em: 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 (Função Server Core sem suporte), Windows Server 2008 R2 (Função Server Core com suporte com o SP1 ou posterior, Itanium sem suporte)

O .NET Framework não oferece suporte a todas as versões de cada plataforma. Para obter uma lista das versões com suporte, consulte Requisitos do sistema do .NET Framework.

Contribuições da comunidade

ADICIONAR
Mostrar:
© 2014 Microsoft