| Autor |
Beitrag |
BlackMatrix
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Di 28.09.10 17:06
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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 339
Erhaltene Danke: 20
Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
|
Verfasst: 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
      
Beiträge: 97
Erhaltene Danke: 11
VS 2010, C#, AHK
|
Verfasst: 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 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 msdn.microsoft.com/e...posable.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
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mi 29.09.10 23:00
Für diesen Beitrag haben gedankt: Yogu
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 29.09.10 23:11
|
|