Entwickler-Ecke

WinForms - Form.Dispose() Methode


BlackMatrix - Di 28.09.10 17:06
Titel: Form.Dispose() Methode
Wieso kann ich nach dem Aufruf von form.Dispose(); immer noch auf den Wert zugreifen, der in der Textbox steht und wie kann ich das unterbinden?

MfG Bunny


Kha - Di 28.09.10 18:37

Eine managed Klasse hält eine managed Ressource, warum sollte Dispose etwas daran ändern? Und was stört dich daran?


BlackMatrix - Di 28.09.10 23:02

Naja mein Programm öffnet und schließt ständig Winforms und ich hatte gehofft, dass durch Disponse die Winform keine Resourcen mehr verbraucht. Wenn ich aber danach noch immer auf die Textbox zugreifen kann, ist die Winform ja doch noch irgendwie da, oder etwa nicht?


Greenberet - Di 28.09.10 23:10

in diesem Fall solltest du den GarbageCollector anregen.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
        [DllImport("kernel32.dll")]
        public static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize);

        /// <summary>
        /// Flushes the memory
        /// </summary>
        public static void FlushMemory()
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
                SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
        }


IsNull - Mi 29.09.10 10:12

Die Managed-Resourcen werden automatisch freigegeben, sobald du keine Referenz mehr auf das Objekt hast.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
myForm = new TestForm();
myForm.Show();


//--> wenn du  nun die Variable myForm auf eine andere Referenz setzt:
myForm = new TestOtherForm();

//--> oder wenn du die Variable = null setzt
myForm = null

oder wenn deine Variable im Scope ihre Sichtbarkeit verliert, dann werden die Resourcen freigegeben. (Zwar nicht unmittelbar, sondern einfach dann wenn der GBC seine Runde dreht)

Mit anderen Worten, es sollte nicht nötig sein, selber noch etwas zu tun.


Um das mit dem Scope nochmals hervorzuheben:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
        private void ShowForms() {

            var from1 = new From();
            var from2 = new From();

            from1.ShowDialog();
            from2.ShowDialog();
        }

Nachdem die Methode ShowForms ihre Arbeit beendet hat, und der Scope nicht mehr auf dieser Methode liegt, verlieren alle lokalen Variabeln dieser Methode ihre Sichtbarkeit, und werden entsorgt.


BlackMatrix - Mi 29.09.10 12:34

Achso?

Also ist es demnach sinnlos, dass ich nach ShowDialog noch Disponse aufrufe wie in diesem Beispiel?


C#-Quelltext
1:
2:
if (form.ShowDialog() == DialogResult.Cancel)
                form.Dispose();


Kha - Mi 29.09.10 18:32

user profile iconBlackMatrix hat folgendes geschrieben Zum zitierten Posting springen:
Also ist es demnach sinnlos, dass ich nach ShowDialog noch Disponse aufrufe wie in diesem Beispiel?
Nein! Alles, was IDisposable implementiert, solltest du nach Benutzung auch disposen. Siehe http://msdn.microsoft.com/en-us/library/system.idisposable.dispose.aspx und sicher noch einige andere interessante Artikel über Google.

user profile iconIsNull hat folgendes geschrieben Zum zitierten Posting springen:
Nachdem die Methode ShowForms ihre Arbeit beendet hat, und der Scope nicht mehr auf dieser Methode liegt, verlieren alle lokalen Variabeln dieser Methode ihre Sichtbarkeit, und werden entsorgt.
Genau genommen könnten die Instanzen schon entsorgt werden, noch während ShowDialog auf ihnen aufgerufen wird.


Yogu - Mi 29.09.10 22:17

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Genau genommen könnten die Instanzen schon entsorgt werden, noch während ShowDialog auf ihnen aufgerufen wird.

Hö? Man kann doch nicht einfach ein Objekt entsorgen, wenn eine seiner Methoden (ShowDialog) noch auf dem Call-Stack steht!? Vor allem, weil ShowDialog als letzte Anweisung sicherlich auf ein Feld zugreift, in dem der DialogResult gespeichert ist.


Kha - Mi 29.09.10 23:00

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Vor allem, weil ShowDialog als letzte Anweisung sicherlich auf ein Feld zugreift, in dem der DialogResult gespeichert ist.
Das stimmt, aber zwischen diesem Feldzugriff und dem Ende der Methode ist ja - immer noch rein theoretisch - trotzdem noch eine Anweisung Platz für eine Garbage Collection ;) . Und damit lautet die Antwort auf
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Hö? Man kann doch nicht einfach ein Objekt entsorgen, wenn eine seiner Methoden (ShowDialog) noch auf dem Call-Stack steht!?
Doch [http://blogs.msdn.com/b/oldnewthing/archive/2010/08/10/10048149.aspx].


Yogu - Mi 29.09.10 23:11

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Vor allem, weil ShowDialog als letzte Anweisung sicherlich auf ein Feld zugreift, in dem der DialogResult gespeichert ist.
Das stimmt, aber zwischen diesem Feldzugriff und dem Ende der Methode ist ja - immer noch rein theoretisch - trotzdem noch eine Anweisung Platz für eine Garbage Collection ;)


The Old New Thing [http://blogs.msdn.com/b/oldnewthing/archive/2010/08/10/10048149.aspx] hat folgendes geschrieben:
A weird real-world analogy: The garbage collector can collect your diving board as soon as the diver touches it for the last time—even if the diver is still in the air!


Ist ja verrückt, man lernt nie aus... Danke für die Fortbildung! :D