Copiar um objeto em C#

Muhammad Maisam Abbas 16 fevereiro 2024
  1. Copie um objeto com o método MemberWiseClone() em C#
  2. Copiar um objeto com o método do construtor parametrizado em C#
Copiar um objeto em C#

Este tutorial irá apresentar métodos para copiar um objeto em C#.

Copie um objeto com o método MemberWiseClone() em C#

Infelizmente, não existe uma maneira interna de criar uma cópia separada de um objeto em C#. Esse fenômeno é demonstrado no exemplo de código a seguir.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace copy_an_object {
  class myClass {
    public String test;
  }
  class Program {
    static void Main(string[] args) {
      myClass a = new myClass();
      a.test = "This is a test";
      myClass b = a;
      b.test = "This is not a test";
      Console.WriteLine(a.test);
      Console.WriteLine(b.test);
    }
  }
}

Resultado:

This is not a test This is not a test

Obtemos a mesma saída nas duas vezes porque uma instância de uma classe em C# é uma variável do tipo de referência que aponta para um local de memória específico. Devido à natureza Orientada a Objetos do C#, o novo ponteiro b também está apontando para a localização da memória de a.

Se quisermos criar uma localização de memória separada para b, temos que confiar em algumas abordagens definidas pelo usuário. O MemberWiseClone() método é usado para criar uma cópia separada dos valores do objeto de chamada em C#. O tipo de retorno da função MemberWiseClone() é objeto. O exemplo de código a seguir nos mostra como criar uma cópia separada de um objeto de classe com a função MemberWiseClone() em C#.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace copy_an_object {
  class myClass {
    public String test;
    public object Clone() {
      return this.MemberwiseClone();
    }
  }
  class Program {
    static void Main(string[] args) {
      myClass a = new myClass();
      a.test = "This is a test";
      myClass b = (myClass)a.Clone();
      b.test = "This is not a test";
      Console.WriteLine(a.test);
      Console.WriteLine(b.test);
    }
  }
}

Resultado:

This is a test This is not a test

Desta vez, fica claro pela saída que há uma cópia separada para cada objeto de classe. Implementamos a função MemberWiseClone() dentro da função Clone() da classe myClass. A função Clone() retorna uma cópia separada do objeto de classe. O valor de retorno da função Clone() é convertido em tipo para myClass e apontado pelo objeto de classe b.

Copiar um objeto com o método do construtor parametrizado em C#

Podemos criar um construtor de classe parametrizado para atingir o mesmo objetivo em C#. Podemos passar o objeto de classe anterior para o construtor de um novo objeto de classe e copiar todos os valores dele. O exemplo de código a seguir nos mostra como podemos criar uma cópia separada de um objeto de classe com o método construtor parametrizado em C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace copy_an_object {
  class MyClass {
    public String test;

    public MyClass() {}

    public MyClass(MyClass other) {
      test = other.test;
    }
  }
  class Program {
    static void Main(string[] args) {
      MyClass a = new myClass();
      a.test = "This is a test";
      MyClass b = new MyClass(a);
      b.test = "This is not a test";
      Console.WriteLine(a.test);
      Console.WriteLine(b.test);
    }
  }
}

Resultado:

This is a test This is not a test

Criamos um construtor parametrizado para a classe MyClass que pega um objeto da classe MyClass e copia a string test dela. Na função main, criamos o objeto a da classe MyClass e o passamos para o construtor de b.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

Artigo relacionado - Csharp Class