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?


  • Administrator

    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 Klassentyp ref angibt, so übergibt man die Referenz auf die Klasse als Referenz. Nur bei Structtypes (bzw. Valuetypes, Werttypen) wirkt sich ref 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?


  • Administrator

    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


Anmelden zum Antworten