web-dev-qa-db-fra.com

C # Form.Close vs Form.Dispose

Je suis nouveau en C # et j'ai essayé de consulter les précédents messages mais je n'ai pas trouvé de réponse satisfaisante.

Dans une application de formulaire Windows C # avec un seul formulaire, l'utilisation de Form.Close() est-elle meilleure ou Form.Dispose()?

MSDN indique que toutes les ressources de l'objet sont fermées et que le formulaire est supprimé lorsqu'un rappel est appelé. Malgré cela, j’ai trouvé plusieurs exemples en ligne qui suivent un Dispose plutôt qu’un Close.

L'un at-il un avantage sur l'autre? Dans quels scénarios devrions-nous préférer l'un par rapport à l'autre?

72
topgun_ivard

This forum sur MSDN vous dit. 

Form.Close() envoie le Windows approprié messages pour arrêter le win32 la fenêtre. Pendant ce processus, si le la forme n'a pas été affichée sous forme modale, Dispose is appelé sur le formulaire. Disposer du formulaire libère les ressources non gérées qui la forme est accrochée. 

Si vous faites une form1.Show() ou Application.Run(new Form1()), Éliminer sera appelé quand Close() sera appelé.

Cependant, si vous faites form1.ShowDialog() pour afficher le formulaire de manière modale, le formulaire ne sera pas éliminé et vous aurez besoin de appeler vous-même form1.Dispose(). JE crois que c'est la seule fois où tu devrait s'inquiéter de disposer du formulaire toi même.

144
Kyra

En règle générale, je préconise toujours d'appeler explicitement la méthode Dispose pour toute classe qui l'offre, en appelant directement la méthode ou en encapsulant un bloc "using". 

Le plus souvent, les classes qui implémentent IDisposible le font car elles enveloppent certaines ressources non gérées qui doivent être libérées. Alors que ces classes devraient avoir des finaliseurs qui agissent comme une sauvegarde, appeler Dispose aidera à libérer cette mémoire plus tôt et avec un temps système inférieur.

Comme indiqué dans le lien de Kyra, dans le cas de l'objet Form, la méthode Close est documentée pour appeler Dispose en votre nom. Vous n'avez donc pas besoin de le faire explicitement. Cependant, pour moi, cela a toujours été comme de compter sur un détail de mise en œuvre. Je préfère toujours appeler à la fois Close et Dispose pour les classes qui les implémentent, afin d'éviter les modifications/erreurs d'implémentation et par souci de clarté. Une méthode Dispose correctement implémentée doit pouvoir être invoquée plusieurs fois en toute sécurité. 

14
Jesse Squire

Ne pas appeler Close contourne probablement l'envoi d'une série de messages Win32 que l'on pourrait penser importants, bien que je ne puisse pas vous dire précisément pourquoi ...

Close a l'avantage de générer des événements (qui peuvent être annulés) de manière à ce qu'un tiers (de la forme) puisse surveiller FormClosing et FormClosed afin de réagir en conséquence.

Je ne sais pas si FormClosing et/ou FormClosed sont générés si vous vous contentez de disposer du formulaire, mais je vous laisse le soin de le tester.

5
Reddog

La ressource gérée Close () peut être temporairement fermée et peut être rouverte.

Dispose () - supprime définitivement les ressources gérées ou non gérées 

0
Yuresh Karunanayake

Utiliser using est un très bon moyen:

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