it-swarm.com.de

C # Form.Close vs Form.Dispose

Ich bin neu in C # und habe versucht, mir die früheren Beiträge anzusehen, konnte aber keine gute Antwort finden.

Wird in einer C # -Formularanwendung mit einem einzelnen Formular Form.Close() besser oder Form.Dispose() verwendet?

MSDN sagt, dass alle Ressourcen innerhalb des Objekts geschlossen sind und das Formular verworfen wird, wenn ein Schließen aufgerufen wird. Trotzdem bin ich online auf mehrere Beispiele gestoßen, die einer Entsorgung und nicht einer Schließung folgen.

Hat einer einen Vorteil gegenüber dem anderen? Unter welchen Szenarien sollten wir eins vorziehen?

72
topgun_ivard

Dieses Forum auf MSDN sagt dir. 

Form.Close() sendet das richtige Windows Meldungen zum Herunterfahren der win32 Fenster. Wenn während dieses Vorgangs die Formular wurde nicht modal angezeigt, Dispose ist auf dem Formular aufgerufen. Das Formular entsorgen gibt die nicht verwalteten Ressourcen frei, die Das Formular hält an. 

Wenn Sie eine form1.Show() oder Application.Run(new Form1()), Entsorgen wird aufgerufen, wenn Close() aufgerufen wird.

Wenn Sie jedoch form1.ShowDialog().__ tun. um das Formular modal anzuzeigen, das Formular wird nicht entsorgt, und Sie benötigen form1.Dispose() selbst anrufen. ICH glaube das ist das einzige mal wenn du sollte sich über die Entsorgung des Formulars Sorgen machen dich selbst.

144
Kyra

Generell empfehle ich immer, die Dispose-Methode für jede Klasse, die sie anbietet, explizit aufzurufen, entweder durch direktes Aufrufen der Methode oder durch Umschließen in einen Verwendungsblock. 

Meistens machen Klassen, die IDisposible implementieren, dies, weil sie eine nicht verwaltete Ressource packen, die freigegeben werden muss. Während diese Klassen Finalizer enthalten sollten, die als Schutz dienen, wird der Aufruf von Dispose dazu beitragen, diesen Speicher früher und mit geringerem Overhead freizugeben.

Im Falle des Form-Objekts ist, wie der Link von Kyra feststellte, die Close-Methode für den Aufruf von Dispose in Ihrem Namen dokumentiert, sodass Sie dies nicht explizit tun müssen. Für mich war das jedoch immer das Gefühl, auf ein Implementierungsdetail angewiesen zu sein. Ich ziehe es vor, immer Close und Dispose für Klassen aufzurufen, die sie implementieren, um Änderungen/Fehler bei der Implementierung zu verhindern und um klar zu sein. Eine ordnungsgemäß implementierte Dispose-Methode sollte mehrmals sicher aufgerufen werden können. 

14
Jesse Squire

Wenn Sie Close nicht aufrufen, wird das Senden einer Reihe von Win32-Nachrichten wahrscheinlich umgangen, was man für wichtig erachtet, obwohl ich Ihnen nicht genau sagen kann, warum ...

Close hat den Vorteil, dass Ereignisse ausgelöst werden können (die storniert werden können), sodass ein Außenstehender (zum Formular) nach FormClosing und FormClosed suchen kann, um entsprechend zu reagieren.

Mir ist nicht klar, ob FormClosing und/oder FormClosed angehoben werden, wenn Sie das Formular einfach ablegen, aber ich überlasse es Ihnen, um damit zu experimentieren.

5
Reddog

Close () - Die verwaltete Ressource kann vorübergehend geschlossen und erneut geöffnet werden.

Dispose () - entfernt verwaltete oder nicht verwaltete Ressourcen dauerhaft 

0

using ist ein ziemlich guter Weg:

using (MyForm foo = new MyForm())
{
    if (foo.ShowDialog() == DialogResult.OK)
    {
        // your code
    }
}
0
Burak Kalkan