Mögliches Duplikat: Wie macht man eine tiefe Kopie eines Objekts in .Net (speziell C#)?
Bitte sehen Sie sich den folgenden Code an (Auszug aus einem C#-Buch):
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();
}
}
Ich verstehe, dass er die folgende Ausgabe erzeugt:
objectA.val = 20
objectB.val = 20
structA.val = 30
structB.val = 40
Mit den letzten beiden Zeilen der Ausgabe habe ich kein Problem, aber die ersten beiden sagen mir, dass ObjektA
und ObjektB
auf denselben Speicherblock verweisen (da in C# Objekte Referenztypen sind).
Die Frage ist, wie man ObjektB
zu einer Kopie von ObjektA
macht, so dass es auf einen anderen Bereich im Speicher zeigt. Mir ist klar, dass der Versuch, ihre Mitglieder zuzuweisen, nicht funktionieren kann, da diese Mitglieder auch Referenzen sein können. Wie kann ich also ObjektB
zu einer völlig anderen Einheit als ObjektA
machen?
Vielen Dank
Das könnten Sie tun:
class myClass : ICloneable
{
public String test;
public object Clone()
{
return this.MemberwiseClone();
}
}
dann können Sie tun
myClass a = new myClass();
myClass b = (myClass)a.Clone();
N.B. MemberwiseClone()
Erzeugt eine oberflächliche Kopie des aktuellen System.Object.
Es gibt keinen eingebauten Weg. Sie können MyClass die Schnittstelle "IClonable" implementieren lassen (aber die ist irgendwie veraltet) oder einfach Ihre eigene Copy/Clone-Methode schreiben. In jedem Fall müssen Sie etwas Code schreiben.
Für große Objekte könnte man Serialisierung + Deserialisierung (über einen MemoryStream) in Betracht ziehen, um vorhandenen Code wiederzuverwenden.
Wie auch immer die Methode aussieht, denken Sie sorgfältig darüber nach, was "eine Kopie" genau bedeutet. Wie tief soll sie gehen, gibt es Id-Felder, die ausgenommen werden müssen usw.
Es gibt bereits eine Frage zu diesem Thema, vielleicht können Sie sie lesen
https://stackoverflow.com/questions/78536/cloning-objects-in-c
Es gibt keine Clone()-Methode, wie sie zum Beispiel in Java existiert, aber Sie könnten einen Kopierkonstruktor in Ihre Clases einbauen, das ist ein weiterer guter Ansatz.
class A
{
private int attr
public int Attr
{
get { return attr; }
set { attr = value }
}
public A()
{
}
public A(A p)
{
this.attr = p.Attr;
}
}
Dies wäre ein Beispiel für das Kopieren des Elements 'Attr' beim Erstellen des neuen Objekts.