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);
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();
myForm = new TestOtherForm();
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
BlackMatrix hat folgendes geschrieben : |
| 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.
IsNull hat folgendes geschrieben : |
| 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
Kha hat folgendes geschrieben : |
| 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
Yogu hat folgendes geschrieben : |
| 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
Yogu hat folgendes geschrieben : |
| 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].
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!