In diesem Beitrag wird erläutert, wie Objekte in C# kopiert werden.
Beim Kopieren eines Objekts wird eine Kopie eines vorhandenen Objekts erstellt. Dies geschieht normalerweise, um die Kopie zu ändern oder zu verschieben, ohne das ursprüngliche Objekt zu beeinträchtigen.
1. Verwenden Object.MemberwiseClone()
Methode
Das Object.MemberwiseClone()
-Methode kann verwendet werden, um eine flache Kopie des aktuellen Objekts zu erstellen. Beziehen Sie sich auf die Microsoft-Dokumentation um eine tiefe Kopie mit der zu implementieren MemberwiseClone()
Methode.
Das folgende Beispiel führt einen flachen Kopiervorgang für das Objekt von X mit der aus MemberwiseClone()
Methode.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System; public class X { public string str; public object Clone() { return this.MemberwiseClone(); } } public class Example { public static void Main() { X obj = new X(); obj.str = "Hello!"; X copy = (X) obj.Clone(); Console.WriteLine(copy.str); } } /* Ergebnis: Hello! */ |
2. Konstruktor kopieren
Der Kopierkonstruktor übernimmt eine weitere Instanz derselben Klasse und definiert die Aktionen des Compilers beim Kopieren des Objekts. Die Implementierung des Kopierkonstruktors sollte eine tiefe Kopie für alle referenzierten Objekte in der Klasse durchführen, indem neue Objekte erstellt und die Werte des unveränderlichen Typs kopiert werden.
Das folgende Codebeispiel zeigt, wie die Kopierkonstruktormethode implementiert wird. Es implementiert auch eine statische Copy-Factory-Methode, die im Wesentlichen dasselbe tut wie die Copy-Constructor-Methode.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
using System; public class X { public string str; public X() {} // Konstruktor kopieren public X(X other) { this.str = other.str; } // Fabrik kopieren public static X GetInstance(X x) { return new X(x); } } public class Example { public static void Main() { X obj = new X(); obj.str = "Hello!"; X copy1 = new X(obj); Console.WriteLine(copy1.str); X copy2 = X.GetInstance(obj); Console.WriteLine(copy2.str); } } |
Das Problem bei den Kopierkonstruktoren ist ihre Wartung, dh wenn ein Objekt strukturell verändert wird, müssen Sie den Kopierkonstruktor modifizieren.
3. Tiefer Klon
Das folgende Codebeispiel veranschaulicht, wie das tiefe Klonen durch BinaryFormatter implementiert wird Serialize()
und Deserialize()
Methoden. Damit dies funktioniert, markieren Sie Ihre Klasse als serialisierbar durch [Serializable]
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializable] public class X { public string str; } public static class Extensions { public static T DeepClone<T>(this T obj) { using (MemoryStream stream = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, obj); stream.Position = 0; return (T) formatter.Deserialize(stream); } } } public class Example { public static void Main() { X obj = new X(); obj.str = "Hello!"; X copy = obj.DeepClone(); Console.WriteLine(copy.str); } } /* Ergebnis: Hello! */ |
Das ist alles über das Erstellen einer Kopie eines Objekts in C#.