A disposição será chamada para variáveis anônimas?
-
03-07-2019 - |
Pergunta
Por exemplo,
int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);
Não há como usar o bloco, nenhuma maneira óbvia de usar um bloco de uso, nenhuma maneira óbvia de ligar para DisponE (). E, é claro, não managedResourceUsingMemorySuckingPig, implementa idispossáveis.
Solução
Se o finalizador dessa classe ligar Dispose()
, sim. Se não, não.
(editar) Apenas algum informação adicional:
Não assuma que o disposto será chamado. Recursos não gerenciados de propriedade de um tipo também devem ser divulgados em um método finalizado no caso de descartar não ser chamado.
Editar
Para esclarecer a edição acima, vi muitas pessoas (neste tópico, assim e em outros lugares) afirmam que "o GC ligará Dispose()
Quando o objeto é removido. "Este não é o caso. Sim, um bom e defensivo codificador escrevendo um componente assumirá que Dispose()
Não será chamado explicitamente e o faz no finalizador. No entanto, um bom codificador defensivo usando um componente deve assumir que o finalizador não chama Dispose()
. Não há chamada automática de Dispose()
no coletor de lixo. Esta funcionalidade está apenas em vigor se o finalizador chama Dispose()
.
Outras dicas
Eu não acredito que sim. Você terá que escrever:
using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig())
{
myResult= urumsp.GetThingsDone(id);
}
Você só pode ter certeza de que, se tiver um finalizador (destruidor), isso será chamado. Um finalizador pode ligar Dispose()
Mas a implementação usual é que o finalizador e Dispose()
ligar protected Dispose(bool)
.
Em outras palavras, depende da implementação de UnmanagedResourceUsingMemorySuckingPig
, se seguir as diretrizes, o objeto anônimo será limpo, mas não tão eficiente quanto em um using
quadra.
Não. No entanto, o GC acabará coletando o objeto e observará que ele é finalizável (é finalizável, certo?) E finalizá -lo para você. O Dispote é para limpar deterministicamente os recursos.