Objekt kopieren
-
Hallo,
ich möchte ein Objekt kopieren. Und zwar so, dass das neue Objekt nicht die Verweise auf die Daten des Original-Objektes enthält, sondern die Daten kopiert.
// In der Klasse habe ich folgende Funktion erstellt public Class_A Clone() { return (Class_A)this.MemberwiseClone(); } // Kopieren: Class_A Original = new Class_A(); Class_A Kopie = new Class_A(); Kopie = Original.Clone();
Die Kopie übergebe ich an einen Thread. Das Problem ist, dass der Thread merkt, wenn das Original geändert wurde. Dort tritt ein Enum-Fehler in einer Foreach-Schleife auf.
Was meint ihr, wird mit der Funktion Clone() eine Tiefe Kopie erstellt oder nicht?
-
sonic_1233 schrieb:
Was meint ihr, wird mit der Funktion Clone() eine Tiefe Kopie erstellt oder nicht?
Natürlich nicht. Das ist auch logisch. Und es steht auch in der Dokumentation zur MemberwiseClone-Methode: "Creates a shallow copy of the current Object."
In dem MSDN-Link stehen auch mehrere Möglichkeiten, wie man tatsächlich eine tiefe Kopie erstellt.
-
Dann ist diese Funktion MemberwiseClone() eigentlich überflüssig.
Man könnte einfach ein Objekt einem anderen zuweisen:// Kopieren: Class_A Original = new Class_A(); Class_A Kopie = new Class_A(); Kopie = Original;
Laut der MSDN-Doku muss man in der Clone() die Klassenproperties einzeln kopieren. Die Implementierung wird bei mir sehr lange dauern, weil meine Klasse hunderte von Properties enthält.
-
Das ist aber keine Kopie, sondern dein "kopie" ist nur eine Referenz auf dein Originial.
-
sonic_1233 schrieb:
Dann ist diese Funktion MemberwiseClone() eigentlich überflüssig.
Ich habe sie zwar bisher nur selten gebraucht, aber sie ist schon sinnvoll, wenn man sich keinen Wolf schreiben möchte. Man muss eben bei Referenztypen aufpassen, wobei das Defaultverhalten - also Referenz kopieren - durchaus sinnvoll ist. Meistens möchte man genau das und nicht "kopiere Inhalt der Referenz". Denn das entspricht eher der ValueType Semantik.
Man könnte einfach ein Objekt einem anderen zuweisen:
Nein, Zuweisung bedeutet je nachdem ob man mit value/reference types hantiert etwas anderes als MemberwiseClone.
Die Implementierung wird bei mir sehr lange dauern, weil meine Klasse hunderte von Properties enthält.
Evtl. ist es an der Zeit, dein Design zu ändern.. allein "hunderte von Properties" klingt recht ungesund.
-
sonic_1233 schrieb:
Die Kopie übergebe ich an einen Thread. Das Problem ist, dass der Thread merkt, wenn das Original geändert wurde. Dort tritt ein Enum-Fehler in einer Foreach-Schleife auf.
Ist dieser Fehler der Grund, warum Du eine Kopie anlegen willst? Kopien sind eigentlich fast nie notwendig und Du bist evtl. auf dem falschen Weg. Was willst Du erreichen?
Bei gemeinsam verwendeten Objekten muss der Zugriff durch verschiedene Threads synchronisiert werden.
-
Mein Gesamt-Objekt enthält eine Liste von Hardware-Objekten.
Also ich übergebe eine Kopie des Gesamt-Objektes an den Backgroundworker. Im Backgroundworker holen die Hardware-Objekte Daten über Ethernet ab. In ProgressChanged() des Backgroundworkers werden die abgefragten Daten des Original-Objektes upgedatet.