Considere el siguiente código:Eliminar, ¿cuándo se llama?
namespace DisposeTest
{
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Calling Test");
Test();
Console.WriteLine("Call to Test done");
}
static void Test()
{
DisposeImplementation di = new DisposeImplementation();
}
}
internal class DisposeImplementation : IDisposable
{
~DisposeImplementation()
{
Console.WriteLine("~ in DisposeImplementation instance called");
}
public void Dispose()
{
Console.WriteLine("Dispose in DisposeImplementation instance called");
}
}
}
El Desechar nunca acaba de llegar de llamada, incluso si pongo un bucle de espera después de la Test();
invocación. Así que eso apesta. Quiero escribir una clase que sea sencilla y muy fácil de usar, para asegurarme de que se limpien todos los recursos posibles. No quiero responsabilizar al usuario de mi clase.
Solución posible: use using
, o llame a Eliminarme (básicamente lo mismo). ¿Puedo forzar al usuario a usar un uso? ¿O puedo forzar la disposición a ser llamado?
Llamar a GC.Collect();
después de Test();
tampoco funciona.
Poner di
en null
no invoca Desechar cualquiera. El Deconstructor FUNCIONA, por lo que el objeto se deconstruye cuando sale Test()
Bien chicos, ¡está claro ahora!
¡Gracias a todos por sus respuestas! ¡Agregaré una advertencia en el comentario!
Pero tenga cuidado de no llamar a ningún otro objeto en su finalizador. El orden de finalización no está definido (especialmente si se permiten las dependencias cruzadas circulares y otras), por lo que lo único que se permite hacer a un finalizador es limpiar los recursos no administrados. – Cygon
¿Por qué el voto a favor? Si no explica lo que piensa que está mal, no puede mejorar la respuesta. – Guffa
No creo que Cygon sea absolutamente correcto en esto, ya que MSDN dice esto: "NO acceda a ningún objeto finalizable en la ruta del código del finalizador, porque existe un riesgo significativo de que ya se hayan finalizado". Nota, dice FINALIZABLE, no CUALQUIERA. No todos los objetos son finalizables por diseño. (referencia: https://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx) – Califf