Possibile duplicato: Come si fa una copia profonda di un oggetto in .Net (C# in particolare)?
Dai un'occhiata al codice qui sotto (estratto da un libro C#):
public class MyClass
{
public int val;
}
public struct myStruct
{
public int val;
}
public class Program
{
private static void Main(string[] args)
{
MyClass objectA = new MyClass();
MyClass objectB = objectA;
objectA.val = 10;
objectB.val = 20;
myStruct structA = new myStruct();
myStruct structB = structA;
structA.val = 30;
structB.val = 40;
Console.WriteLine("objectA.val = {0}", objectA.val);
Console.WriteLine("objectB.val = {0}", objectB.val);
Console.WriteLine("structA.val = {0}", structA.val);
Console.WriteLine("structB.val = {0}", structB.val);
Console.ReadKey();
}
}
Ho capito che produce l'output qui sotto:
objectA.val = 20
objectB.val = 20
structA.val = 30
structB.val = 40
Le ultime due righe dell'output non mi danno problemi, ma le prime due mi dicono che oggettoA
e oggettoB
puntano allo stesso blocco di memoria (poiché in C# gli oggetti sono tipi di riferimento).
La domanda è come fare di oggettoB
, una copia di oggettoA
in modo che punti ad un'area diversa della memoria. Capisco che cercare di assegnare i loro membri potrebbe non funzionare, dato che anche quei membri potrebbero essere riferimenti. Quindi come faccio a rendere l'oggettoB un'entità completamente diversa dall'oggettoA?
Grazie
Si può fare:
class myClass : ICloneable
{
public String test;
public object Clone()
{
return this.MemberwiseClone();
}
}
allora puoi fare
myClass a = new myClass();
myClass b = (myClass)a.Clone();
N.B. MemberwiseClone()
Crea una copia superficiale dell'attuale System.Object.
Non c'è un modo integrato. Puoi far implementare a MyClass l'interfaccia IClonable
(ma è un po' deprecata) o semplicemente scrivere il tuo metodo Copy/Clone. In entrambi i casi dovrete scrivere del codice.
Per oggetti grandi si potrebbe considerare la serializzazione + deserializzazione (attraverso un MemoryStream), solo per riutilizzare il codice esistente.
Qualunque sia il metodo, pensate attentamente a ciò che "una copia" significa esattamente. Quanto in profondità dovrebbe andare, ci sono campi Id da escludere, ecc.
C'è già una domanda su questo, forse potresti leggerla
https://stackoverflow.com/questions/78536/cloning-objects-in-c
Non c'è un metodo Clone() come esiste in Java per esempio, ma potresti includere un costruttore di copia nei tuoi clase, questo è un altro buon approccio.
class A
{
private int attr
public int Attr
{
get { return attr; }
set { attr = value }
}
public A()
{
}
public A(A p)
{
this.attr = p.Attr;
}
}
Questo sarebbe un esempio, copiando il membro 'Attr'quando si costruisce il nuovo oggetto.