una qué pasar parametros otro objetos objeto new método lista crear copiar copia como clonar clase c# object reference cloning

qué - new objeto c#



Crear una copia de un objeto en C# (4)

Posible duplicado:
¿Cómo se hace una copia profunda de un objeto en .Net (C # específicamente)?

Por favor, eche un vistazo al código a continuación (extracto de un libro de 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(); } } }

Entiendo que produce el resultado a continuación

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

Las dos últimas líneas de la salida no tienen ningún problema, pero las dos primeras me dicen que objectA y objectB apuntan al mismo bloque de memoria (ya que en C #, los objetos son tipos de referencia).

La pregunta es cómo hacer objectB , una copia de objectA para que apunte a un área diferente en la memoria. Entiendo que tratar de asignar sus miembros puede no funcionar ya que esos miembros también pueden ser referencias. Entonces, ¿cómo hago para hacer que objectB una entidad completamente diferente de objectA ?

Gracias


La forma más fácil de hacerlo es escribiendo un constructor de copia en la clase MyClass.

Algo como esto:

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

El segundo constructor simplemente acepta un parámetro de su propio tipo (el que desea copiar) y crea un nuevo objeto asignado con el mismo valor

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

salida:

objectA.val = 10 objectB.val = 20


No hay una forma incorporada. Puede hacer que MyClass implemente la interfaz IClonable (pero está en desuso) o simplemente escriba su propio método Copiar / Clonar. En cualquier caso, tendrá que escribir un código.

Para objetos grandes, podría considerar Serialización + Deserialización (a través de un MemoryStream), solo para reutilizar el código existente.

Cualquiera que sea el método, piense cuidadosamente sobre lo que significa "una copia" exactamente. ¿Qué tan profundo debería ser? ¿Hay campos de Id para ser exceptuados?


Podrías hacerlo:

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

entonces puedes hacer

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

NB MemberwiseClone() Crea una copia superficial del System.Object actual.


Ya hay una pregunta sobre esto, quizás podrías leerlo

Objetos de clonación profunda

No existe un método Clone () como existe en Java, por ejemplo, pero podría incluir un constructor de copia en sus clases, ese es otro buen enfoque.

class A { private int attr public int Attr { get { return attr; } set { attr = value } } public A() { } public A(A p) { this.attr = p.Attr; } }

Esto sería un ejemplo, copiando el miembro ''Attr'' al construir el nuevo objeto.