Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Wie erstellt man eine unabhängige Kopie eines Objekts einer fremden Klasse?
digi333
myCSharp.de - Member



Dabei seit:
Beiträge: 302

Themenstarter:

Wie erstellt man eine unabhängige Kopie eines Objekts einer fremden Klasse?

beantworten | zitieren | melden

Wie erstellt man von einer Instanz eine unabhängige Kopie die nicht vom Original referenziert wird?


class Punkt
{
  int x;
  int y;
}


// Klasse wird verwendet in Methode
void doIt(Punkt p1)
{
   Punkt p2 = p1;
   // folgende Zeile würde auch p1 verändern
   p2.x = 0;
}


Was kann ich machen damit p1.x jetzt nicht zu Null wird? (Gibt es ein const ref wie in C?)
private Nachricht | Beiträge des Benutzers
Briefkasten
myCSharp.de - Member

Avatar #avatar-1523.gif


Dabei seit:
Beiträge: 444

beantworten | zitieren | melden

Hallo,

für das Speichern von x und y kannst du statt einer class ein struct verwenden. Struct ist ein WerteTyp. Class ist ein Referenztyp.

Achja du könntest auch Point verwenden. Dann hast du schon eine fertige Klasse.

Referenztypen und Wertetypen werden in der Speicherung unterschiedlich gehandhabt.

Siehe dazu auch:
Value Types (C# Reference)

class (C#-Referenz)

ICloneable-Schnittstelle
Unterstützt das Klonen, wobei eine neue Instanz einer Klasse mit denselben Werten wie eine vorhandene Instanz erstellt wird.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Briefkasten am .
Schaut mal im IRC vorbei:
Server: [email protected]#c#.de oder [email protected]#csharp
private Nachricht | Beiträge des Benutzers
digi333
myCSharp.de - Member



Dabei seit:
Beiträge: 302

Themenstarter:

beantworten | zitieren | melden

Das war nur ein Beispiel mit Punkt. Die Klasse hätte auch Mond oder Stern heißen können.

Der Hinweis mit dem Struct war mir bekannt, jedoch war das nicht die Frage. Es kann ja eine Klasse aus einer fremden DLL sein.
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

Hallo,

bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1
private Nachricht | Beiträge des Benutzers
digi333
myCSharp.de - Member



Dabei seit:
Beiträge: 302

Themenstarter:

beantworten | zitieren | melden

Auch danke für diesen Hinweis... Ich weiß, dass class ein Referenztyp ist und ich weiß auch, dass es das Galileobuch dazu gibt. Danke also nochmal für diese Hinweise.

Was macht ihr wenn ihr eine kompilierte DLL bekommt. In dieser DLL ist eine Klasse die ihr zwei mal braucht. Einmal als Original und ein mal als eine Arbeitskopie die ihr verändert wollt.

Da sie kompiliert ist konnt ihr als auch nicht eine Methode Copy() hinzufügen. Was macht ihr um dieses Problem zu lösen?
private Nachricht | Beiträge des Benutzers
Edward
myCSharp.de - Member



Dabei seit:
Beiträge: 119
Herkunft: Bremen

beantworten | zitieren | melden

Hallo Digi,

in einem unserer alten Projekte wurde es so gelöst, dass eine Clone() Methode implementiert wurde, die ein übergebenes Objekt Property für Property kopiert und eine komplett neue Instanz zurück liefert.

Vielleicht ist das ja ein Ansatz.

Gruß,
Edward
private Nachricht | Beiträge des Benutzers
Stefan O.
myCSharp.de - Member



Dabei seit:
Beiträge: 72
Herkunft: Bergisch Gladbach

beantworten | zitieren | melden

Hallo digi333,

ist es möglich das du einfach eine 2te Instanz der Klasse erstellst?

Ansonsten müsstest du mal nach Deep Copy googlen. Vielleicht gibts da ein Tool oder so, das solche arbeiten erledigen kann.

Gruß
Stefan O.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo digi333,
Zitat
Einmal als Original und ein mal als eine Arbeitskopie die ihr verändert wollt.
falscher Ansatz. Warum steht in Kopie ohne ICloneable.

Lösung: Memento-Pattern.

herbivore
private Nachricht | Beiträge des Benutzers
digi333
myCSharp.de - Member



Dabei seit:
Beiträge: 302

Themenstarter:

beantworten | zitieren | melden

Edward: Bei einer DLL sind die Property Objekte meistens nicht öffentlich.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo digi333,

die Properties sind sowieso nicht das, was man sichern sollte, sondern die Felder/Fields. Zu diesem Unterschied siehe: Untersch. Behandlung der Objektdaten bzgl. Modifizierer bei Serialisierung in den versch. Formaten. Per Reflection kommt man aber ohnehin an alles.

herbivore
private Nachricht | Beiträge des Benutzers
digi333
myCSharp.de - Member



Dabei seit:
Beiträge: 302

Themenstarter:

beantworten | zitieren | melden

@herbivore: Schau ich mir mal an.

@stefan O.: Das Deep Copy setzt voraus, dass das Objekt serialisierbar ist. Dann kann man mit MemoryStream und BinaryFormater eine zweie Kopie erstellen. Ich kann aber nicht immer davon ausgehen, dass eine fremde DLL das liefert.
private Nachricht | Beiträge des Benutzers
rasepretrep
myCSharp.de - Member



Dabei seit:
Beiträge: 105

beantworten | zitieren | melden

Wie schon von Herbivore gesagt, kommt Du über reflection auch an die geschützten Properties heran.

Allerdings ist Dein Beispiel richtig übler Programmierstil. Objecte, die von einer fremden Bibliothek herausgereicht werden sollte man IMMER auch von der Bibliothek behandelt lassen.
Das ist in C oder C++ auch nicht anders oder sogar noch "schlimmer" als in C# (z.B. unterschiedliche malloc() und free() Implementierungen in verschiedenen Dlls).
private Nachricht | Beiträge des Benutzers