O que o til antes de um nome de função significa em C #?
Pergunta
Eu estou olhando para algum código e tem a seguinte declaração:
~ConnectionManager()
{
Dispose(false);
}
Os implementos de classe da interface IDisposable
, mas eu não sei se isso é parte do que o til (~) é utilizado.
Solução
~ é o destruidor
- Destructors são invocados automaticamente e não pode ser invocado explicitamente.
- Destructors não pode ser sobrecarregado. Assim, uma classe pode ter, no máximo, um destruidor.
- Destructors não são herdadas. Assim, uma classe não possui senão o único, que pode ser declarado nele destruidores.
- Destructors não pode ser usado com estruturas. Eles são usados ??somente com classes. Uma instância torna-se elegível para a destruição quando já não é possível para qualquer código para usar o exemplo.
- A execução do destrutor para a instância pode ocorrer a qualquer momento após a instância torna-se elegível para a destruição.
- Quando uma instância é destruído, as destruidores na sua cadeia herança são chamados, em ordem, a partir de mais derivado de menos derivada.
Finalize
Em C #, o método Finalize executa as operações que um destruidor padrão C ++ faria. Em C #, você não nomeá-lo Finalize - você usa o C ++ sintaxe destruidor de colocar um til (~) símbolo antes do nome da classe.
Eliminar
É preferível dispor de objectos num método Close()
ou Dispose()
que podem ser chamados explicitamente pelo utilizador da classe. Finalize (destructor) são chamados pelo GC.
O IDisposable de interface diz ao mundo que sua classe prende em recursos que precisam ser eliminados e fornece aos usuários uma maneira de liberá-los. Se você precisa implementar um finalizador na sua classe, o seu método Dispose deve usar o método GC.SuppressFinalize()
para garantir que a finalização da sua instância é suprimida.
O que usar?
Não é legal para chamar um destrutor explicitamente. Seu destrutor será chamado pelo coletor de lixo. Se você fizer punho precioso recursos não gerenciados (como identificadores de arquivo) que deseja fechar e descartar o mais rápido possível, você deve implementar a interface IDisposable.
Outras dicas
Esta é uma finalizador . Para ser honesto, você deve muito raramente precisa escrever um finalizador. Você realmente só precisa escrever um se:
- Você tem acesso directo a um recurso não gerenciado (por exemplo através de uma
IntPtr
) e você não pode usarSafeHandle
que torna mais fácil - Você está implementando
IDisposable
em uma classe que não está selado. (Minha preferência é para as classes de vedação a menos que eles são projetados para herança.) Um finalizador faz parte do padrão Dispose canônica em tais casos.
É usado para indicar o destruidor para a classe.
Mesmo como C ++, é o destruidor; no entanto, em C # você não chamou-lhe explicitamente, ela é invocada quando o objeto seja recolhido.
Consulte Destructors (C # Guia de Programação) . Esteja ciente, no entanto, que, ao contrário do C ++, programador não tem controle sobre quando o destruidor é chamado, porque isso é determinado pelo coletor de lixo.
~ normalmente representa uma deconstructor. que é executado logo antes de um objeto morre.
Aqui está uma descrição do C # desconstrutores i encontrados