2011-12-24 3 views

Répondre

40

Aucun des deux n'est «meilleur» que l'autre; ils sont parfaitement équivalents!

Cependant, dans ce cas particulier, sont tous deux faux. Le ShowDialog method vous oblige à appeler la méthode Dispose sur le formulaire. Contrairement à la combinaison Show et Close, cela n'est pas fait automatiquement. De MSDN:

Lorsqu'un formulaire est affiché sous la forme d'une boîte de dialogue modale, en cliquant sur le bouton Fermer (le bouton avec un X dans le coin supérieur droit de la forme) provoque la forme d'être caché et la propriété DialogResult à définir sur DialogResult.Cancel. Contrairement aux formulaires non modaux, la méthode Close n'est pas appelée par le .NET Framework lorsque l'utilisateur clique sur le bouton de fermeture d'une boîte de dialogue ou définit la valeur de la propriété DialogResult. Au lieu de cela, le formulaire est masqué et peut être affiché à nouveau sans créer une nouvelle instance de la boîte de dialogue. Parce qu'un formulaire affiché en tant que boîte de dialogue est masqué au lieu de fermé, vous devez appeler la méthode Dispose du formulaire lorsque le formulaire n'est plus nécessaire par votre application.

Ainsi, vous devez choisir entre l'un de ces (équivalent) formes:

using (Form1 frm = new Form1()) 
{ 
    frm.ShowDialog(); 
} 

ou

Form1 frm = new Form1(); 
frm.ShowDialog(); 
frm.Dispose(); 

La raison pour laquelle ShowDialog ne dispose pas automatiquement la forme est assez simple, si ce n'est pas immédiatement évident. Il s'avère que les applications souhaitent souvent lire les valeurs d'une instance d'un formulaire de dialogue modal après le formulaire a été fermé, tels que les paramètres spécifiés dans les contrôles du formulaire. Si le formulaire a été automatiquement supprimé, vous ne pourrez pas lire ces valeurs en accédant aux propriétés de l'objet formulaire. Ainsi, le programmeur est responsable de la disposition des formes montrées comme des boîtes de dialogue modales quand il en a fini avec elles.

+0

Excellente explication de la raison pour laquelle MODAL conserve la forme en mémoire pour extraire les autres éléments lors de sa fermeture et ne pas être libérée automatiquement. – DRapp

+0

Juste pour clarifier: si l'instance de formulaire est conservée dans une variable locale, elle sera éligible pour la récupération de place quand elle sortira de la portée et sera * finalement * éliminée (voir cette SO [réponse] (http://stackoverflow.com/a/11690188/945456)). Encore une bonne idée de le faire explicitement bien sûr. –

+0

Sauf le reste, la toute première phrase est ** mauvaise **. Puisque vous devez/devriez appeler 'frm.Dispose();' le 2ème est pire que le premier. Quelle honte en vue de la bonne réponse après! – Bitterblue

2

En général, je pencherais pour la première 1 parce que vous pouvez accéder au formulaire par la suite.

Sinon, le 2 est bon, si vous ne voulez pas le traiter après qu'il est fermé.

+0

la mémoire dispose() à (new form1()). ShowDialog(); ? –

+0

demandez-vous si la mémoire est éliminée après la fin du showdialog. Si c'est le cas, alors la mémoire pour tout objet dans C# est éliminée dès que rien ne le mentionne plus. Donc, une fois le dialogue fermé, toutes les références ont disparu et le GC fera ce qu'il veut. –

Questions connexes