Entwickler-Ecke

Basistechnologien - Kann ein Referenztyp als Werttyp behandelt werden?


Palladin007 - Sa 22.12.12 18:13
Titel: Kann ein Referenztyp als Werttyp behandelt werden?
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 - Sa 22.12.12 18:50

Du kannst das übergebene Objekt klonen:
http://msdn.microsoft.com/de-de/library/system.object.memberwiseclone.aspx
Mit Google lassen sich dafür auch leicht noch mehr Möglichkeiten finden.


Palladin007 - 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 - 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


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


ist nicht mal kürzer als


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 - 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] [http://www.mycsharp.de/wbb2/thread.php?threadid=8764] aus dem myCSharp-Forum durchlesen.


Palladin007 - 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.