Usando o DialogResult corretamente

Em uma resposta a uma pergunta recente que tive ( aqui ), Hans Passant afirmou que eu deveria definir o DialogResult para fechar meus formulários em vez de form.Close() embora eu não consiga descobrir por quê?

Se eu tiver lido corretamente, a documentação do MSDN afirma que isso apenas ocultará o formulário em vez de descartá-lo corretamente, o que eu acreditava que o .Close() faria?

Extrair da documentação.

O método Close não é chamado automaticamente quando o usuário clica no botão Fechar de uma checkbox de diálogo ou define o valor da propriedade DialogResult. Em vez disso, o formulário é oculto e pode ser mostrado novamente sem criar uma nova instância da checkbox de diálogo. Devido a esse comportamento, você deve chamar o método Dispose do formulário quando o formulário não é mais necessário pelo seu aplicativo.

Por outro lado, a Microsoft criou uma página de suporte que diz como usar a propriedade DialogResult e, na seção “Verificar se ela funciona”, afirma que clicar assim fechará o formulário.

Então, minha pergunta é dupla, devo continuar a usar Close ou DialogResult; e faz o diálogo fechar ou ocultar um formulário. A partir do código que fiz abaixo (um formulário simples com dois botões), parece que é realmente escondido apenas como um ponto de interrupção sobre this.Close() é atingido .. (com this.Close() comentou, a forma ainda desaparece , não tenho certeza se escondido ou não)

  public Form1() { InitializeComponent(); button1.Click += (s, e) => { //I edited my question to include using using(Form1 form = new Form1()) { form.ShowDialog(); } }; button2.Click += (s, e) => { this.DialogResult = DialogResult.OK; this.Close(); }; } 

Quando você abre um modal dialog com ShowDialog, o código de chamada é bloqueado até que o formulário chamado feche ou oculte. Se você quiser ler algumas propriedades públicas do formulário chamado e quiser fazer coisas (por exemplo, salvar dados em um database ou em um arquivo) com base no clique no botão OK ou Cancelar, você precisa saber se o usuário deseja para fazer a ação ou não. O DialogResult retornado pelo método ShowDialog () permite que você execute as ações apropriadas …

Então, por exemplo

 using (Form1 form = new Form1()) { DialogResult dr = form.ShowDialog(); if(dr == DialogResult.OK) { string custName = form.CustomerName; SaveToFile(custName); } } 

Se você chama Close ou define a propriedade DialogResult não é realmente o problema. Você só precisa certificar-se de chamar Dispose . Eu prefiro fazer isso com um bloco de uso:

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

Eu originalmente pensei que você poderia chamar ShowDialog em um Form que já teve seu método Close chamado. Este não é o caso. Se você mostrar o formulário modalmente com ShowDialog , não parece importar se ele está fechado como resultado do método Close ou definindo a propriedade DialogResult . Parece que definir o DialogResult é apenas um atalho para fechar o Form .

Mas se você chamar Close ou definir a propriedade DialogResult , a chave é certificar-se de chamar Dispose() ou colocar seu formulário em um bloco de uso.