Copiar un objeto en C#

Muhammad Maisam Abbas 16 febrero 2024
  1. Copiar un objeto con el método MemberWiseClone() en C#
  2. Copiar un objeto con el método de constructor parametrizado en C#
Copiar un objeto en C#

Este tutorial presentará métodos para copiar un objeto en C#.

Copiar un objeto con el método MemberWiseClone() en C#

Desafortunadamente, no existe una forma integrada de crear una copia separada de un objeto en C#. Este fenómeno se demuestra en el siguiente ejemplo de código.

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);
    }
  }
}

Producción :

This is not a test
This is not a test

Obtenemos el mismo resultado en ambas ocasiones porque una instancia de una clase en C# es una variable de tipo de referencia que apunta a una ubicación de memoria específica. Debido a la naturaleza orientada a objetos de C#, el nuevo puntero b también apunta a la ubicación de memoria de a.

Si queremos crear una ubicación de memoria separada para b, tenemos que confiar en algunos enfoques definidos por el usuario. El método MemberWiseClone() se utiliza para crear una copia separada de los valores del objeto de llamada en C#. El tipo de retorno de la función MemberWiseClone() es objeto. El siguiente ejemplo de código nos muestra cómo crear una copia separada de un objeto de clase con la función MemberWiseClone() en 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);
    }
  }
}

Producción :

This is a test
This is not a test

Esta vez se desprende claramente del resultado que hay una copia separada para cada objeto de clase. Implementamos la función MemberWiseClone() dentro de la función Clone() de la clase myClass. La función Clone() devuelve una copia separada del objeto de clase. El valor de retorno de la función Clone() se convierte en tipo myClass y apunta al objeto de clase b.

Copiar un objeto con el método de constructor parametrizado en C#

Podemos crear un constructor de clases parametrizado para lograr el mismo objetivo en C#. Podemos pasar el objeto de clase anterior al constructor de un nuevo objeto de clase y copiar todos sus valores. El siguiente ejemplo de código nos muestra cómo podemos crear una copia separada de un objeto de clase con el método constructor parametrizado en 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);
    }
  }
}

Producción :

This is a test
This is not a test

Creamos un constructor parametrizado para la clase MyClass que toma un objeto de la clase MyClass y copia la cadena test de él. En la función main, creamos el objeto a de la clase MyClass y se lo pasamos al constructor 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

Artículo relacionado - Csharp Class