Tiefenkopieren benutzerdefinierter Objekte in C#
In diesem Artikel geht es um das Klonen von Objekten in C#, wobei der Schwerpunkt auf der Unterscheidung zwischen Referenz- und Werttypen liegt und wie man wirklich tiefe Kopien benutzerdefinierter Objekte erstellt. Wir verwenden Beispiele, um das Verhalten von MyClass
(einem Referenztyp) und myStruct
(einem Werttyp) bei der Zuweisung zu veranschaulichen. Wie erwartet werden Änderungen an einer Referenztypinstanz in anderen Referenzen widergespiegelt, da sie denselben Speicherort verwenden. Werttypen erstellen jedoch unabhängige Kopien.
Um eine echte Kopie eines benutzerdefinierten Objekts zu erstellen, implementieren wir die ICloneable
-Schnittstelle. Dies erfordert die Definition einer Clone
-Methode, die eine neue Instanz mit identischen Eigenschaftswerten generiert.
Implementierung ICloneable
für Deep Copying
Der folgende Code demonstriert die Implementierung von ICloneable
für eine tiefe Kopie, die verschachtelte Objekte verarbeitet:
<code class="language-csharp">class MyClass : ICloneable { public string test; public object Clone() { MyClass newObj = (MyClass)this.MemberwiseClone(); // Shallow copy first // Handle nested objects for a deep copy (example) // if (this.nestedObject != null) // { // newObj.nestedObject = (NestedObjectType)this.nestedObject.Clone(); // } return newObj; } }</code>
MemberwiseClone()
erstellt eine flache Kopie. Um eine tiefe Kopie zu erreichen, müssen Sie alle verschachtelten Objekte innerhalb der Clone
-Methode explizit klonen, wie im kommentierten Beispiel gezeigt. Dies erfordert rekursives Klonen, wenn verschachtelte Objekte auch verschachtelte Objekte enthalten.
Erstellen einer tiefen Kopie mit der Clone
-Methode:
<code class="language-csharp">MyClass a = new MyClass(); MyClass b = (MyClass)a.Clone();</code>
Dadurch wird sichergestellt, dass b
eine völlig unabhängige Kopie von a
ist, auch wenn a
komplexe verschachtelte Strukturen enthält. Denken Sie daran, den Abschnitt zum Klonen verschachtelter Objekte an Ihre spezifische Klassenstruktur anzupassen.
Das obige ist der detaillierte Inhalt vonWie kann ich eine tiefe Kopie eines benutzerdefinierten Objekts in C# erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!