Copiare un oggetto in C#

Muhammad Maisam Abbas 11 dicembre 2023
  1. Copiare un oggetto con il metodo MemberWiseClone() in C#
  2. Copiare un oggetto con il metodo del costruttore con parametri in C#
Copiare un oggetto in C#

Questo tutorial introdurrà metodi per copiare un oggetto in C#.

Copiare un oggetto con il metodo MemberWiseClone() in C#

Sfortunatamente, non esiste un modo predefinito per creare una copia separata di un oggetto in C#. Questo fenomeno è illustrato nel seguente esempio di codice.

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

Produzione:

This is not a test This is not a test

Otteniamo lo stesso output entrambe le volte perché un’istanza di una classe in C# è una variabile di tipo riferimento che punta a una posizione di memoria specifica. A causa della natura orientata agli oggetti di C#, il nuovo puntatore b punta anche alla posizione di memoria di a.

Se vogliamo creare una locazione di memoria separata per b, dobbiamo fare affidamento su alcuni approcci definiti dall’utente. Il metodo MemberWiseClone() viene utilizzato per creare una copia separata dei valori dell’oggetto chiamante in C#. Il tipo di ritorno della funzione MemberWiseClone() è object. Il seguente esempio di codice ci mostra come creare una copia separata di un oggetto classe con la funzione MemberWiseClone() in 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);
    }
  }
}

Produzione:

This is a test This is not a test

Questa volta è chiaro dall’output che esiste una copia separata per ogni oggetto classe. Abbiamo implementato la funzione MemberWiseClone() all’interno della funzione Clone() della classe myClass. La funzione Clone() restituisce una copia separata dell’oggetto classe. Il valore di ritorno della funzione Clone() è convertito in myClass e puntato dall’oggetto classe b.

Copiare un oggetto con il metodo del costruttore con parametri in C#

Possiamo creare un costruttore di classi parametrizzato per raggiungere lo stesso obiettivo in C#. Possiamo passare l’oggetto della classe precedente al costruttore di un nuovo oggetto della classe e copiarne tutti i valori. Il seguente esempio di codice ci mostra come creare una copia separata di un oggetto classe con il metodo del costruttore parametrizzato in 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);
    }
  }
}

Produzione:

This is a test This is not a test

Abbiamo creato un costruttore parametrizzato per la classe MyClass che prende un oggetto della classe MyClass e copia da esso la stringa test. Nella funzione main, abbiamo creato l’oggetto a della classe MyClass e lo abbiamo passato al costruttore di 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

Articolo correlato - Csharp Class