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

  • »
  • Community
  • |
  • Diskussionsforum
Variablenübergabe an Form ohne Referenz
interzone
myCSharp.de - Member



Dabei seit:
Beiträge: 95
Herkunft: wien

Themenstarter:

Variablenübergabe an Form ohne Referenz

beantworten | zitieren | melden

ich übergebe in meinem programm von einer form ein objekt einer klasse über den konstruktor zu einer anderen form. anscheinend nimmt die 2te form nur eine referenz auf das objekt in der owner form und manipuliert die urspüngliche variable. wie kann ich das verhindern?

thx im vorraus
private Nachricht | Beiträge des Benutzers
Pulpapex
myCSharp.de - Member



Dabei seit:
Beiträge: 939
Herkunft: Rostock

beantworten | zitieren | melden

Deswegen nennt man Klassen auch Referenztypen. Es werden nur Referenzen auf Objekte umhergereicht, keine Kopien.

Wenn du eine Kopie brauchst, kannst du z.B. das ICloneable-Interface implementieren oder du fügst deiner Klasse einen Kopier-Konstruktor hinzu. Ein Konstruktor, der ein Objekt des selben Types entgegennimmt und aus diesem die Werte entnimmt, um ein zweites Objekt zu initialisieren.

Du kannst statt einer Klasse auch eine Struktur verwenden. Das wäre dann ein Wertetyp. Wertetypen werden bei einer Zuweisung kopiert. Bei jeder Zuweisung, also wenn es eine grosse Struktur ist, bisschen darauf achten.
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Oder einfach die Klasse immutable machen, d.h. unveränderbar. Also nur Read-only-Felder und/oder Methoden, die geänderte Kopien des Objektes rausgeben (so macht es die Sring-Klasse).
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo interzone,

oder einfach einen ReadOnly-Wrapper für die Klasse zur Verfügung stellen (so macht es die ArrayList-Klasse).

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



Dabei seit:
Beiträge: 95
Herkunft: wien

Themenstarter:

beantworten | zitieren | melden

ein altes problem hat mich wieder eingeholt. ich suche noch immer eine lösung für mein problem aus dem ersten post.

momentan hab ich eine clone() methode implementiert um das gewünschte objekt zu klonen vor dem bearbeiten. bevor ich das objekt zum bearbeiten schicke wird es also geklont, damit das geklonte objekt bearbeitet wird. lösche ich ein subobjekt aus diesem objekt und verwerfe die änderung in meinem programm werden die änderungen brav verworfen. ändere ich ein subobjekt aus diesem objekt wird das subobjekt auch im stammobjekt geändert...

hab schon ein paar mal clone() eingebaut, dann versucht diese subobjekte (sind arrays) mit copyto() zu kopieren - aber bringt alles nix. das einzige was funzt ist löschen verwerfen - andere änderungen werden wie gesagt nicht verworfen...
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo interzone,

was du willst, ist dass das Objekt nicht geändert werden kann. Deshalb ist kopieren ein feilen an Symptomen (Änderungen rückgängig machen). Das ist - auch wenn ich Pulpapex schätze - der falsche Weg.

Verfolge die anderen Vorschläge, also immutable oder ReadyOnly-Wrapper oder ändere die Methode ganz einfach so, dass sie das Objekt nicht ändert.

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



Dabei seit:
Beiträge: 95
Herkunft: wien

Themenstarter:

beantworten | zitieren | melden

so ich glaube ich habs jetzt geschafft - jedoch etwas unschön. jedes meiner zu klonenden objekte hat ja mehrere subobjekte gleichen typs in einem array gespeichert. vorher hatte ich probiert das komplette array zu klonen (funzt nicht), jetzt hab ich eine for-schleife, die mir das komplette array element für element ausliest und element für element klont. ist das vllt schlechter für die performance? es werden da 2 arrays durchlaufen - sie haben 100 elemente...
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo interzone,

der Weg ist auch dann schlecht, wenn die Performance (die hier sicher ziemlich ungünstig ist) stimmen würde. Bei OOP kommt es m.E. nicht nur darauf an, sein Ziel zu erreichen, sondern das auf eine angemessene Weise zu tun. Welche Wege ich präferieren würde, habe ich ja schon gesagt.

herbivore
private Nachricht | Beiträge des Benutzers