Operowanie na referencji poza konstuktorem

0

Witam.
Mój problem polega na tym, że nie wiem jak uwolnić referencję z konstuktora.

public partial class Form1 : Form
{
   private bool bZmienna;
   public Form1()
   {
      bZmienna = false;
      Form2 noweOkno = new Form2(ref bZmienna);
      if(bZmienna) { /* ... */ }
   }
}

private partial class Form2 : Form
{
   private bool bZmienna2;
   public Form2(bool ref _bZmienna)
   {
      InitializeComponent();
      //  jak stąd przekopiować referencję dalej
   }
   private void button1_Click(object sender, EventArgs e)
   {
        bZmienna2 = true;
        this.Close();
    }
}

 

Jeśli przekazuję przez referencję zmienną z klasy Form1 do Form2, to mogę na niej operować tylko w zasięgu konstruktora, a ja potrzebuję operować na niej w innych metodach, tak że po zamknięciu okna w metodzie button1_Click, zmienna bZmienna w klasie Form1 pozostaje zmieniona na true tak, abym instrukcja warunkowa została spełniona.

Mam nadzieję, że dobrze opisałem swój problem.

0

Przede wszystkim po wywołaniu konstruktora kod dalej będzie się wywoływał i o ile nie zmienisz tej wartości w konstruktorze Form2 to warunek nigdy się nie sprawdzi. Robiąc to z resztą w ten sposób nie dowiesz się tak naprawdę o momencie ustawienia tej zmiennej - musiałbyś dodatkowo podpiąć zdarzenie zamykania Form2. Ewentualnie możesz zrezygnować z tej śmiesznej referencji i dodać własne zdarzenie - byłoby to lepsze rozwiązanie. Ale wydaje mi się, że tutaj powinieneś skorzystać z czegoś, co już istnieje: blokującego ShowDialog() i właściwości DialogResult.

0

Wielkie dzięki. Użyłem ShowDialog() i wystarczyło mi.

0

Można opakować typ prosty w klasę, i taka klasa będzie się zachowywać tak jakbyś chciał. (już bez żadnego ref przy przekazywaniu parametru)

    public wtf class RefBool
    {
        private bool value;
        public RefBool(bool a)
        {
            value = a;
        }
        public static implicit operator RefBool(bool b)
        {
            return new RefBool(b);
        }
        public static implicit operator bool(RefBool r)
        {
            return r.value;
        }
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1