Problem bei Variablenübergabe
-
Hallo, ich habe ein Problem bei der Übergabe einer VisualCollection. Übergeben wird die VisualCollection von meinem Canvas an den Konstructor meiner PrintDialog-Klasse:
Window printWindow = new PrintDialog(canvas.ModelCollection);
public partial class PrintDialog : Window, INotifyPropertyChanged { public PrintDialog(VisualCollection modelCollection) { InitializeComponent(); PreviewCanvas.ModelCollection = modelCollection; } }
wobei die Übergabe an den PreviewCanvas im PrintDialog folgender maßen geschieht:
public VisualCollection ModelCollection { get { return m_ModelCollection; } set { m_ModelCollection = value; } }
Das Problem: Sämtliche Änderungen an der m_ModelCollection führen zu einer Veränderung der ürsprünglich übergebenen Variable (canvas.ModelCollection). Laut
http://www.aspnetzone.de/blogs/peterbucher/archive/2007/02/12/c-parameter-bergabe-default-by-value-by-reference-und-out.aspx
dürfre dies aber nicht passieren, da ich das Schlüsselwort "ref" nicht verwende, also nicht folgendes mache:Window printWindow = new PrintDialog(ref canvas.ModelCollection);
Warum wirkt sich die Änderung trotzdem auf die ursprüngliche Variable aus?
-
Klassen sind in C# Referenztypen. Wenn du ein Objekt einer Klasse übergibst, übergibst du tatsächlich eine Referenz. Ist genau wie in Java.
ref
ist daher bei Klassentypen anders zu verstehen. Wenn man bei einem Klassentypref
angibt, so übergibt man die Referenz auf die Klasse als Referenz. Nur bei Structtypes (bzw. Valuetypes, Werttypen) wirkt sichref
so aus, dass das Objekt als Referenz übergeben wird.Am besten schaust du dir nochmals die Thematik Reference- und Valuetype an.
http://msdn.microsoft.com/en-us/library/0f66670z.aspx
Grüssli
-
Mhh, das ist natürlich schlecht. Wie könnte ich denn dann ein PreviewCanvas im PrintDialog verwirklichen?
-
Student83 schrieb:
Mhh, das ist natürlich schlecht. Wie könnte ich denn dann ein PreviewCanvas im PrintDialog verwirklichen?
Wieso überhaupt veränderst du in einer Preview das Objekt?
Ansonsten ist es schwer dir da Hilfe zu geben, ohne die genaueren Umstände zu kennen. Grundsätzlich kannst du probieren das Objekt zu kopieren, was ich allerdings für ziemlich umständlich halte, da man extrem aufpassen muss, dass nirgends eine flache Kopie passiert. Ansonsten, falls du nur den Schreibzugriff sperren willst, kannst du ein ReadOnly-Wrapper bauen oder einer der vorhandenen verwenden.Grüssli