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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top