Creare una copia di un object in C #

Possibile duplicato:
Come si fa a copiare in profondità un object in .Net (in particolare C #)?

Si prega di dare un’occhiata al codice qui sotto (estratto da un libro C #):

namespace Example { class MyClass { public int val; } struct myStruct { public int val; } class Program { 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(); } } } 

Capisco che produce l’output di seguito

 objectA.val = 20 objectB.val = 20 structA.val = 30 structB.val = 40 

Le ultime due righe dell’output non hanno alcun problema, ma i primi due mi dicono che objectA e objectB puntano allo stesso blocco di memoria (poiché in C #, gli oggetti sono tipi di riferimento).

La domanda è come creare objectB , una copia objectA modo che punti a un’area diversa nella memoria. Capisco che il tentativo di assegnare i propri membri potrebbe non funzionare poiché anche questi membri potrebbero essere riferimenti. Quindi, come faccio a fare objectB un’entity framework completamente diversa objectA ?

Grazie

Non esiste un modo integrato. Puoi avere MyClass per implementare l’interfaccia IClonable (ma è un po ‘deprecato) o semplicemente scrivere il tuo metodo Copy / Clone. In entrambi i casi dovrai scrivere del codice.

Per i grandi oggetti potresti prendere in considerazione la serializzazione + la deserializzazione (attraverso un MemoryStream), solo per riutilizzare il codice esistente.

Qualunque sia il metodo, pensa attentamente a cosa significa “una copia” esattamente. Quanto deve essere profondo, ci sono campi di identificazione ecc. Ecc.

Potresti fare:

 class myClass : ICloneable { public String test; public object Clone() { return this.MemberwiseClone(); } } 

allora puoi farlo

 myClass a = new myClass(); myClass b = (myClass)a.Clone(); 

NB MemberwiseClone() Crea una copia superficiale dell’attuale System.Object.

Il modo più semplice per farlo è scrivere un costruttore di copia nella class MyClass.

Qualcosa come questo:

 namespace Example { class MyClass { public int val; public MyClass() { } public MyClass(MyClass other) { val = other.val; } } } 

Il secondo costruttore accetta semplicemente un parametro del proprio tipo (quello che si desidera copiare) e crea un nuovo object assegnato con lo stesso valore

 class Program { static void Main(string[] args) { MyClass objectA = new MyClass(); MyClass objectB = new MyClass(objectA); objectA.val = 10; objectB.val = 20; Console.WriteLine("objectA.val = {0}", objectA.val); Console.WriteLine("objectB.val = {0}", objectB.val); Console.ReadKey(); } } 

produzione:

 objectA.val = 10 objectB.val = 20 

C’è già una domanda su questo, potresti forse leggerlo

Oggetti di clonazione profonda

Non esiste un metodo Clone () come esiste in Java, ad esempio, ma potresti includere un costruttore di copia nelle tue clases, 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 object.