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
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.