Possivel duplicata: Como se faz uma cópia profunda de um objeto em .Net (C# especificamente)?
Por favor, veja o código abaixo (trecho de um livro em 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();
}
}
Eu entendo que produz a produção abaixo:
objectA.val = 20
objectB.val = 20
structA.val = 30
structB.val = 40
As duas últimas linhas da saída não tenho problemas com isso, mas as duas primeiras me dizem que objectA
e objectB
estão apontando para o mesmo bloco de memória (já que em C#, os objetos são tipos de referência).
A questão é como fazer o objectB
, uma cópia do objectA
para que ele aponte para uma área diferente na memória. Eu entendo que tentar designar seus membros pode não funcionar, uma vez que esses membros também podem ser referências. Então como faço para fazer do objectB
uma entidade completamente diferente do objectA
?
Obrigado
Você poderia fazer:
class myClass : ICloneable
{
public String test;
public object Clone()
{
return this.MemberwiseClone();
}
}
então você pode fazer
myClass a = new myClass();
myClass b = (myClass)a.Clone();
N.B. MemberwiseClone()
Cria uma cópia rasa do System.Object atual.
Não há nenhuma maneira integrada. Você pode ter a MyClass implementando a interface `IClonable' (mas ela é meio depreciada) ou apenas escrever seu próprio método Copy/Clone. Em ambos os casos, você terá que escrever algum código.
Para objetos grandes você poderia considerar Serialização + Deserialização (através de um MemoryStream), apenas para reutilizar o código existente.
Qualquer que seja o método, pense cuidadosamente sobre o que " uma cópia" significa exactamente. Até onde deve ir, se há campos Id a serem excluídos, etc.
Já há uma pergunta sobre isso, talvez você possa lê-la...
https://stackoverflow.com/questions/78536/cloning-objects-in-c
Não há nenhum método Clone() como existe em Java, por exemplo, mas você poderia incluir um construtor de cópias em seus clases, que's outra boa abordagem.
class A
{
private int attr
public int Attr
{
get { return attr; }
set { attr = value }
}
public A()
{
}
public A(A p)
{
this.attr = p.Attr;
}
}
Isto seria um exemplo, copiando o membro 'Attr' ao construir o novo objeto.