Estoy trabajando con este código como ejemplo:
var p = new person("Amir"); var zp = new person("Amiraa"); GC.Collect(); GC.WaitForPendingFinalizers(); class person { public person(string nName) { Console.WriteLine("New"); string name = nName; } ~person() { Console.WriteLine("Garbage collected"); } }Pero el resultado en la consola solo muestra "Nuevo", no "Basura recolectada". Entonces, ¿por qué el gc no funciona?
Experimente y notará que su código funciona como se espera en Release , pero no necesariamente en Debug .
Esto se debe a que las variables p y zp todavía están dentro del alcance en el punto en que llama a GC.Collect() . Todavía se refieren a las instancias de person .
En la versión, el GC recopilará felizmente los objetos a los que hacen referencia las variables que aún están dentro del alcance, siempre que no se vuelvan a usar. En Debug, el depurador debe permitirle ver el contenido de todas las variables que están dentro del alcance, de modo que el GC no pueda recopilarlas.
Si lo haces:
var p = new person("Amir"); var zp = new person("Amiraa"); p = null; zp = null; GC.Collect(); GC.WaitForPendingFinalizers();Verá el resultado que espera , incluso en Depuración. Tenga en cuenta que la compilación por niveles introducida en .NET 6 afecta esto, y es posible que la prueba anterior no funcione como se esperaba.
Si introduce un método separado, por lo que las vidas útiles de p y zp tienen un alcance explícito, debería ver el comportamiento esperado incluso en .NET 6 en Debug :
Test(); GC.Collect(); GC.WaitForPendingFinalizers(); void Test() { var p = new person("Amir"); var zp = new person("Amiraa"); }