Možné duplikáty: [Ako urobiť hĺbkovú kópiu objektu v .Net (konkrétne v C#)?] (https://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-an-object-in-net-c-specifically)
Pozrite si prosím nasledujúci kód (výňatok z knihy o jazyku 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();
}
}
Chápem, že to vytvára nasledujúci výstup:
objectA.val = 20
objectB.val = 20
structA.val = 30
structB.val = 40
S poslednými dvoma riadkami výstupu nemám problém, ale prvé dva mi hovoria, že objectA
a objectB
ukazujú na ten istý blok pamäte (keďže v C# sú objekty referenčné typy).
Otázka znie, ako vytvoriť z objektuB
kópiu objektuA
tak, aby ukazovala na inú oblasť v pamäti. Chápem, že pokus o priradenie ich členov nemusí fungovať, pretože aj tieto členy môžu byť referenciami. Ako mám teda postupovať, aby objektB
bol úplne inou entitou ako objektA
?
Vďaka
Mohli by ste:
class myClass : ICloneable
{
public String test;
public object Clone()
{
return this.MemberwiseClone();
}
}
potom môžete urobiť
myClass a = new myClass();
myClass b = (myClass)a.Clone();
N.B. MemberwiseClone()
Vytvorí plytkú kópiu aktuálneho System.Object.
Neexistuje žiadny zabudovaný spôsob. Trieda MyClass môže implementovať rozhranie IClonable
(ale to je už zastarané) alebo si napísať vlastnú metódu Copy/Clone. V oboch prípadoch budete musieť napísať nejaký kód.
V prípade veľkých objektov by ste mohli zvážiť Serializáciu + Deserializáciu (prostredníctvom MemoryStream), len aby ste mohli opätovne použiť existujúci kód.
Bez ohľadu na metódu si dobre premyslite, čo presne znamená "kopírovanie". Ako hlboko by mala ísť, či existujú polia Id, ktoré sa majú vyňať atď.
Už je tu o tom otázka, možno by ste si ju mohli prečítať
https://stackoverflow.com/questions/78536/cloning-objects-in-c
V Jave napríklad neexistuje metóda Clone(), ale môžete do svojich tried zahrnúť konštruktor kopírovania, to je ďalší dobrý prístup.
class A
{
private int attr
public int Attr
{
get { return attr; }
set { attr = value }
}
public A()
{
}
public A(A p)
{
this.attr = p.Attr;
}
}
Toto by bol príklad, kopírovanie člena 'Attr' pri konštrukcii nového objektu.