Verweis- und Wertetypen
-
Hallo,
bitte segnet mir nur kurz ab, ob das so korrekt ist:
Verweistypen sind "inmutable". Wird ein Verweistyp nicht auch explizit als Referenz übergeben, ist sein Wert unveränderlich. Ändert man einen Wert aber trotzdem, wird "hintenrum" eine Kopie angelegt, auf die die Änderung dann tatsächlich wirksam wird.
Im Prinzip kann man sagen, es ist egal was da intern genau passiert, denn für mich gilt immer nur folgendes:
Ich kann mit Verweistypen genau so arbeiten wie mit Wertetypen, aber die Laufzeitumgebung kümmert sich für mich, dass das möglichst schnell geschieht, d.h. Kopien nur dann angelegt werden, wenn es nötig ist.Im Prinzip ist mir das alles schon klar, aber ich hab mir hier gerade diese alte Wunde aufgerissen, weil ich mich mal sehr gewundert hab, wieso ich bei einem offensichtliche Verweistyp scheinbar wie mit einem Wertetyp arbeiten konnte. (Verweistyp aus einer Methode zurückgeliefert, Wert im aufrufenden Code geändert, Änderung hatte aber nur auf eine Kopie effekt...)
-
frage123 schrieb:
Verweistypen sind "inmutable".
Falsch.
Wird ein Verweistyp nicht auch explizit als Referenz übergeben, ist sein Wert unveränderlich.
Falsch.
Ändert man einen Wert aber trotzdem, wird "hintenrum" eine Kopie angelegt, auf die die Änderung dann tatsächlich wirksam wird.
Nein.
Ich kann mit Verweistypen genau so arbeiten wie mit Wertetypen, aber die Laufzeitumgebung kümmert sich für mich, dass das möglichst schnell geschieht, d.h. Kopien nur dann angelegt werden, wenn es nötig ist.
Nein, absolut nicht. Und stolpern wird man sich darauf verlässt, dass eine Zuweisung den Wert kopiert (was sie eben nicht tut).
-
Hmm, kann es dann sein, dass mir eine Methode eine Kopie zurück gibt, ohne das ich es bemerke?
Wie würde die Methode das anstellen? Am Beispiel einer einfachen Klasse, die z.B. nur ein Int hält.
-
frage123 schrieb:
Hmm, kann es dann sein, dass mir eine Methode eine Kopie zurück gibt, ohne das ich es bemerke?
Von einem Referenztyp? Nein.
Wie würde die Methode das anstellen? Am Beispiel einer einfachen Klasse, die z.B. nur ein Int hält.
Per Aufruf von 'Clone'.
class Test : ICloneable { private int m_Value; public Test(int value) { m_Value = value; } public int Value { get { return m_Value; } set { m_Value = value; } } public object Clone() { return MemberwiseClone(); } } Test MachNeKopie(Test x) { return (Test)x.Clone(); }
Beachte, dass man die von 'object' geerbte Methode 'MemberwiseClone' nur verwenden kann, wenn man intern einfache Typen verwendet, da eine flache Kopie erzeugt wird (mehr Infos in der MSDN).