Verwendung von ref-Parameter



  • Hi Leute!

    Ich habe da mal ne Frage:

    Ich habe in Klasse 1 ein mehrere int-Werte, die ich als ref-Parameter an den Konstruktor der Klasse 2 übergebe.

    Wie kann ich nun aus einer anderen Methode in Klasse 2 auf die Übergebenen werte zugreifen so das sich dann die werte auch gleich mit in Klasse 1 ändern?

    Mfg
    blind

    PS.: Danke schonmal für eure Hilfe



  • Hast du code dazu?



  • Das kannst du nicht; du kannst keine refs zwischenspeichern. Du musst es in Klassen wrappen, oder unsafe Zeiger benutzen...



  • ich möchte ja nicht die ref`s in dem sinne speichern jedoch möchte ich aus der Methode heraus den wert der referenz eines int`s zB ändern.

    ein Code-Beispiel kann ich nur als pseudocode geben

    public class Dialog
    {
      public Dialog(ref IList<PD> pds,ref IList<UD> uds,ref UD currentUD, SP sp,ref Cl cl,ref int maxUC,ref int maxWC)
      {
        InitializeComponent();
      }
    
      private void Methode()
      {
         //Hier nun zugriff / ändern des Werts von maxUC
      }
    }
    
    pubic class SP
    {
      private IList<PD> pds;
      private IList<UD> uds;
      private UD currentUD;
      private Cl cl;
      private int maxUC;
      private int maxWC;
    
    ...
    
      private void TEST()
      {
        ...
        Dialog dg = new Dialog(ref pds,ref uds,ref currentUD, this,ref cl,ref maxUC,ref maxWC);
        ...
      }
    }
    


  • Übergibt doch im Konstruktor von Dialog eine Referenz auf das SP Objekt. Über Vererbung und protected brauchst Du auch keine public Properties. Bzw benutze friend um die Sichtbarkeit auf das Assembly zu beschränken.
    Oder schreibe in SP eine Methode/Property das die Daten ändert.

    Aber das Klassen die Privaten Daten der jeweiligen anderen Klasse ändern widerspricht der Objekt Orientierung.



  • Wieso verwendest Du..

    ref IList<PD> pds,ref IList<UD> uds
    

    .. in deinem Konstruktor?

    IList ist doch sowieso nur eine Referenz!
    Was passiert denn wenn man einen Referenztypen mit ref übergibt?
    Verstehe das nicht ganz.

    Gruß



  • littleg schrieb:

    Was passiert denn wenn man einen Referenztypen mit ref übergibt?
    Verstehe das nicht ganz.

    Du kannst der übergebenen Variable eine neue Liste zuweisen, und der Aufrufer bekommt es mit. Siehe:

    void func1(ref List<int> liste)
    {
        liste = new List<int>();
    }
    
    void Main()
    {
        List<int> liste = null; //explizit um es zu verdeutlichen
        func1(liste);
        liste.Add(12); // würde ohne "ref List<int>" zur NullReferenceException führen, da liste immernoch null wäre
    }
    


  • Hallo!

    Ah, das ergibt Sinn!
    d.h. ref erlaubt auch den "Zeiger umzubiegen".

    Weil ohne ref könnte ich ja trotzdem einer vorhandenen Liste Elemente hinzufügen und entfernen, und die Veränderung wäre auch in der aufrufenden Methode zu sehen.
    Aber ohne ref kann ich kein neues Objekt mit "new" erstellen, das ist dann der Unterschied.

    Habe ich das so richtig verstanden?

    Gruß



  • void func1(ref List<int> liste)
    {
    liste = new List<int>();
    }

    void Main()
    {
    List<int> liste = null; //explizit um es zu verdeutlichen
    func1(liste);
    liste.Add(12); // würde ohne "ref List<int>" zur NullReferenceException führen, da liste immernoch null wäre
    }

    Aquivalentes bspw. c managed

    Pointer wird kopiert p =p1, beim verlassen des scopes ist p auserhalb immer noch den alten wert.

    void func1(Foo* p1){ 
     p1= new Foo();
    }
    
    Foo *p=null;
    func(p);
    p->DoSomething()
    

    übergibt man ihn als referenz, geht es..

    void func1(Foo** p1){ 
     *p1= new Foo();
    }
    
    Foo *p=null;
    func(&p);
    p->DoSomething()
    

Log in to reply