PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C Sharp Vaiable Verweis oder Kopie?


Gast
2009-10-09, 14:54:44
Kann mir hier jemand sagen von was es bei C sharp abhängt ob wenn ich schreibe variabe1 = variable2 ein verweis oder eine kopie bei den variablen entsteht?

Xmas
2009-10-09, 15:01:33
Das hängt davon ab ob der Typ der Variable ein Werttyp (Value Type (http://msdn.microsoft.com/en-us/library/s1ax56ch(VS.80).aspx)) oder ein Referenztyp (Reference Type (http://msdn.microsoft.com/en-us/library/490f96s2(VS.80).aspx)) ist. Im ersteren Fall wird kopiert, im zweiten Fall nur eine Referenz zugewiesen.

Gast
2009-10-09, 15:15:57
also ist es bei einem z.b. character eine kopie und bei einem string ein verweis? wie kann ich dann eigentlich das eine oder das andere erzwingen?

PatkIllA
2009-10-09, 15:52:08
gar nicht. Ist auch mi ziemlicher Sicherheit eine Schwäche im Design.
Notfalls kannst du mehrere Rückgabewerte mit dem out Schlüselwort kennzeichnen, wenn es dir um sowas geht.
Kopie von einem String nützt dir zum Beispiel schon mal nichts, weil du den eh nicht ändern kannst.

Monger
2009-10-09, 15:54:27
also ist es bei einem z.b. character eine kopie und bei einem string ein verweis?

Ganz genau.

wie kann ich dann eigentlich das eine oder das andere erzwingen?
Wenn du ein Struct oder Enum deklarierst, hast du einen Value Typen. Hast du eine Klasse, ist es ein Reference Type.

Aber Achtung: Structs haben so ihre Tücken. Die Werte eines Structs z.B. liegen auf dem aktuellen Call Stack drauf, und nicht etwa im Object Heap. Microsoft empfiehlt deshalb, in einem Struct keine komplexen Strukturen, sondern nur einige wenige Variablen (am besten Value Types) zu deklarieren.

Wenn du die Stabilität eines Value Types ohne dessen Nachteile brauchst, solltest du darüber nachdenken dein Objekt "immutable" (unveränderbar) zu machen - so wie einen String.

Gast
2009-10-09, 16:15:02
es gibt also auch keine möglichkeit eine kopie von einem verweisenden typ anzufertigen wenn mir dieser nicht z.b. eine copy methode anbietet?

Monger
2009-10-09, 16:22:01
Richtig. Es gibt zwar schmutzige Tricks à la "Clone", aber das hat mitunter ziemlich seltsame Nebeneffekte.

Das Problem ist nämlich auch: was genau bedeutet eigentlich eine "Kopie" des referenzierten Typs? Tiefe Kopie, flache, oder doch irgendwas zwischendrin?

Was ist bei gegenseitiger Referenzierung? (beidseitig Verkettete Listen o.ä.)

Das wirft eine Menge Fragen auf, die man mit keinem universalen Mechanismus erschlagen kann.

Gast
2009-10-09, 17:30:32
Danke für die umfassenden antworten :)

Gnafoo
2009-10-10, 13:26:55
Der Vollständigkeit halber sei noch erwähnt: es gibt das ICloneable-Interface, das Objekte implementieren können, die eine sinnvolle Copy-Funktionalität anbieten.

Außerdem vererbt Object die Methode MemberwiseClone (allerdings nur protected), die eine flache Kopie eines Objektes erstellt (d. h. Referenz-Typen zeigen in der Kopie nach wie vor auf das selbe Objekt). Trotzdem kann das hilfreich sein, wenn man Clone implementiert, aber sich das manuelle Kopieren aller Value-Types sparen will, bzw. wenn das Objekt nur Value-Types enthält.