Autor Beitrag
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Sa 22.12.12 18:13 
Moin

Es gibt ja die Möglichkeit, via ref einen Werttyp als Referenztyp zu behandeln.
Geht das auch umgekehrt, dass ein Referenztyp als Werttyp behandelt wird, oder muss ich dafür eine Kopie vom jeweiligen Objekt anlegen?

So kann ich dann in einer Methode frei an den Parametern arbeiten, ohne dass das was an den ursprünglich übergebenen Objekten ändern würde. Wenn die Parameter aber als Referenztyp behandelt werden, würde ja auch jede Änderung nach Ausführung der Methode erhalten bleiben, das will ich aber nicht.

Gibt es da eine schlanke Methode, ähnlich wie das Gegenstück ref?


Gruß
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 22.12.12 18:50 
Du kannst das übergebene Objekt klonen:
msdn.microsoft.com/d...memberwiseclone.aspx
Mit Google lassen sich dafür auch leicht noch mehr Möglichkeiten finden.
Palladin007 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Sa 22.12.12 18:53 
Ja, das weiß ich, aber ich hatte auf einen ebenso schnellen und einfachen Weg gehofft, wie es ref für die umgekehrte Variante anbietet.

Es gibt also keine so einfache Möglichkeit, die bisher nur an mir vorbei gegangen ist. Schade, dann muss ich doch klonen. ^^
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 22.12.12 19:38 
Zitat:
Es gibt also keine so einfache Möglichkeit, die bisher nur an mir vorbei gegangen ist. Schade, dann muss ich doch klonen. ^^


Schade??? Denke noch mal genau nach ;)

Es gibt keine Definition was denn ein Klon genau ist (Deep, Shallow oder irgendwas dazwischen) wie sollte also dein gewünschtes Schlüsselwort genau das machen was du gerade brauchst? Wenn es das gäbe hätte wahrscheinlich Murphy genau die Definition von Klon gewählt die dir nicht hilft und du müßtest es doch selbst machen.
Bei so Sprachfeaturewünschen verweise ich gern auf c++. Da sieht man wo Featurewahn hinführt. Millionen Möglichkeiten sich in den Fuss zu schießen ohne spürbaren Produuktivitätsgewinn. Eher das Gegenteil.

Und der Code

ausblenden C#-Quelltext
1:
MeineFunktion(unref instance)  // oder wie dieses Schlüsselwort euch immer heißen möge					


ist nicht mal kürzer als

ausblenden C#-Quelltext
1:
MeineFunktion(instance.Clone())					

Es verschleiert nur was genau passiert während du dir bei der Implementierung von Clone gedanken gemacht hast was für eine Sorte von Clone du brauchst.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 22.12.12 19:43 
Hallo Paladin,

je nachdem welche Änderungen du am (kopierten) Objekt vornehmen willst, solltest du eine tiefe Kopie in Betracht ziehen (MemberwiseClone erzeugt nur eine flache Kopie).
Ich würde dir jedoch raten eine eigene Kopiermethode (bzw. einen Kopierkonstruktor) zu erzeugen.

Wenn du viel Zeit hast, kannst du dir gerne auch mal den Thread Kopie ohne ICloneable [oder warum man Objekte nicht kopieren sollte; Transaktionen auf Objekten] aus dem myCSharp-Forum durchlesen.
Palladin007 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Sa 22.12.12 19:52 
Ich wollte einfach nur verhindern, dass die Änderungen am Objekt innerhalb der Methode auf das Objekt außerhalb der Methode Auswirkungen haben, wie es eben normalerweise ist. Gut, blöd erklärt, weil ein Objekt sowohl innerhalb, als auch außerhalb der Methode immer noch das gleiche Objekt ist, aber ihr wisst, was ich meine. ^^

Ich habe hier nämlich einen Typ, den ich ursprünglich als Struktur schreiben wollte, aber dafür wurde die dann zu kompliziert.


@Th69:
Der Typ enthält nur zwei Attribute, eine byte-Liste und ein Attribut vom Typ bool. ^^
Und ich brauche das auch nur intern, hab deshalb jetzt simpel eine kleine Methode zum klonen geschrieben.