Eu sou novo no C # e tentei ler as postagens anteriores, mas não encontrei uma boa resposta.
Em um aplicativo C # Windows Form com um único formulário, está usando Form.Close()
melhor ou Form.Dispose()
?
MSDN diz que todos os recursos dentro do objeto são fechados e o formulário é descartado quando um Close é invocado. Apesar disso, encontrei vários exemplos online que seguem um Dispose em vez de um Close.
Um tem vantagem sobre o outro? Em quais cenários devemos preferir um em vez do outro?
form.Visible = false;
pode ligarform.Hide()
. Na verdade,form.Hide()
simplesmente definethis.Visible = false;
.Respostas:
Este fórum no MSDN informa isso.
fonte
Como regra geral, eu sempre recomendaria chamar explicitamente o método Dispose para qualquer classe que o oferecesse, seja chamando o método diretamente ou envolvendo um bloco "usando".
Na maioria das vezes, as classes que implementam IDisposible o fazem porque envolvem algum recurso não gerenciado que precisa ser liberado. Embora essas classes devam ter finalizadores que agem como uma proteção, chamar Dispose ajudará a liberar essa memória mais cedo e com menor sobrecarga.
No caso do objeto Form, como o link de Kyra observou, o método Close está documentado para invocar Dispose em seu nome, portanto, você não precisa fazer isso explicitamente. No entanto, para mim, sempre pareceu confiar em um detalhe de implementação. Eu prefiro sempre chamar Close e Dispose para classes que os implementam, para me proteger contra alterações / erros de implementação e para ser claro. Um método Dispose implementado corretamente deve ser seguro para invocar várias vezes.
fonte
Não ligar
Close
provavelmente ignora o envio de um monte de mensagens Win32 que se poderia pensar que são de alguma forma importantes, embora eu não pudesse dizer especificamente por quê ...Close
tem o benefício de aumentar eventos (que podem ser cancelados) de modo que um estranho (para a forma) possa observarFormClosing
eFormClosed
reagir de acordo.Não estou certo se
FormClosing
e / ouFormClosed
são gerados se você simplesmente descartar o formulário, mas vou deixar isso para você experimentar.fonte
Usar
using
é uma maneira muito boa:using (MyForm foo = new MyForm()) { if (foo.ShowDialog() == DialogResult.OK) { // your code } }
fonte
Close () - o recurso gerenciado pode ser fechado temporariamente e pode ser aberto novamente.
Dispose () - remove permanentemente o recurso gerenciado ou não gerenciado
fonte
ShowDialog()
. Caso contrário,Close()
descartará o formulário também.Se você usar form.close () em seu formulário e definir o evento FormClosing do seu formulário e usar form.close () neste evento, você cairá em um loop ilimitado e um argumento fora do intervalo acontecerá e a solução é mudar a forma .close () com form.dispose () em Evento de FormClosing. Espero que essa dica te ajude !!!
fonte
O que acabei de experimentar com as ferramentas de diagnóstico do VS é que chamei de this.Close () e o evento formclosing foi acionado. Então, quando eu chamo this.Dispose () no final do evento Formclosing, onde disponho muitos outros objetos nele, ele limpa tudo de forma muito mais suave.
fonte