¿Se dispondrá de disposición para variables anónimas?
-
03-07-2019 - |
Pregunta
Por ejemplo,
int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);
No hay bloque de uso, no hay una manera obvia de usar un bloque de uso, no hay una forma obvia de llamar a Dispose (). Y, por supuesto, UnmanagedResourceUsingMemorySuckingPig implementa IDisposable.
Solución
Si el finalizador de esa clase llama Dispose ()
, sí. Si no, no.
(editar) Solo algunos información adicional :
No asumas que Dispose será llamado. Recursos no gestionados propiedad de un tipo también debe ser lanzado en una Finalizar el método en caso de que Disose no se llama.
Editar
Para aclarar la edición anterior, he visto a muchas personas (en este hilo, en SO y en otros lugares) afirmar que " El GC llamará a Dispose ()
cuando se elimine el objeto. " ; Este no es el caso en absoluto. Sí, un buen codificador defensivo que escribe un componente asumirá que Dispose ()
no se llamará explícitamente y lo hace en el finalizador. Sin embargo, un buen codificador defensivo que USA un componente debe asumir que el finalizador NO llama a Dispose ()
. No hay llamadas automáticas de Dispose ()
en el recolector de basura . Esta funcionalidad SOLO se implementa si el finalizador llama Dispose ()
.
Otros consejos
No lo creo. Tendrás que escribir:
using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig())
{
myResult= urumsp.GetThingsDone(id);
}
Solo puede estar seguro de que si tiene un Finalizer (destructor) se llamará.
Un finalizador puede llamar a Dispose ()
pero la implementación habitual es que tanto el finalizador como Dispose ()
llaman a protegido Dispose (bool)
.
En otras palabras, depende de la implementación de UnmanagedResourceUsingMemorySuckingPig
, si sigue las pautas, el objeto anónimo se eliminará, pero no tan eficientemente como con un usando
bloque.
No. Sin embargo, el GC eventualmente recogerá el objeto y notará que es finalizable (es finalizable, ¿verdad?) Y lo finalizará por usted. La disposición es para la limpieza determinista de los recursos.