Destruidores raramente são usados em C#, então muitas pessoas já os esqueceram, embora sejam pouco úteis e inúteis para estudar.
Um. Características dos destruidores:
Destruidores só podem existir em classes, não estruturas; O destruidor não pode ter modificadores, incluindo modificadores de controle de acesso, modificadores estáticos, modificadores abstratos, modificadores virtuais, etc.; O destruidor não tem parâmetros, o que significa que não pode haver sobrecarga.
Dois. Quando chamar o destrutor:
O destruidor é chamado quando o objeto é reciclado pelo coletor de lixo, mas o coletor de lixo tem uma característica: é preguiçoso, Ele não recicla a variável imediatamente após sair do escopo e da vida útil, mas apenas quando acha apropriado, geralmente quando a memória está apertada. Por exemplo:
Após o método btn_Click retornar, o de deve ser terminado, mas seu destruidor não é chamado, indicando que o coletor de lixo não o reciclou; Quando você fecha o formulário, o destruidor é executado, indicando que, ao final do programa, o coletor de lixo é forçado a reciclá-lo (^-^). Claro, podemos chamar o GC.Collect() para forçar a reciclagem:
Quando você clica em btn1, de1 e o novo Demo() são encerrados e o destruidor é chamado. o de2 ainda não expirou seu período de vida, então mesmo que o método GC.Collect seja chamado, ele não será reciclado; quando o btn1_Click retorna, o de2 expirou seu período de vida, mas devido à preguiça do coletor de lixo, ainda não é reciclado; Só quando btn2 chama o método GC.Collect é que de2 é recuperado e seu destruidor é chamado.
Uma forma de evitar chamadas de destrutores é implementar a interface IDisposable, que define um método único: Dispose(). Isso impede que o destruidor seja chamado internamente, o que significa que, se você estiver entediado, pode implementar essa interface sem chamar o GC.SuppressFinalize(^-^), que é irrelevante porque não bloqueia o destruidor:
Agora o destruidor de de1 não será chamado.
Três. A essência do destruidor:
Um destruidor é essencialmente um método que assume a forma de:
Normalmente pensamos que destruidores só podem ser chamados pelo sistema, não pelos próprios programadores, mas isso não é totalmente verdade, e destruidores também podem ser chamados explicitamente, afinal, é apenas um método:
Destruidores não são necessários a menos que recursos não gerenciados estejam abertos na classe
|