Hola a todos,
Mis dudas son als siguientes:
1) Cuando utilizamos C# no es posible sobreescribir el metodo
Finalize, en cambio utilizamos el simbolo ~ para declarar el
destructor. Este metodo se convierte posteriormente en una
sobreescritura de Finalize. Ahora bien, en el libro de Anders H. The
C# Programming Language se menciona que es posible proveer
Destructores mediante un metodo con la siguiente firma void Finalize.
Ahora en el siguiente codigo:
using System;
class Elve
{
~Elve()
{
Console.WriteLine("Here die an elve");
}
}
class DarkElve : Elve
{
void Finalize()
{
Console.WriteLine("Here die a dark elve");
}
}
class Program
{
public static Main()
{
Elve feanor = new Elve();
legolas=null;
System.GC.Collec();
System.GC.WaitForPendingFinalizers();
}
}
la salida es:
here die an elve
el destructor de Elve es pasado de por alto, sin embargo el codigo
MSIL es igual para ambas clases. ¿Alguien sabe por que pasa esto?
2) Esta duda es mas bien conceptual, en el libro The C# Programming
Language se enumera el ciclo de vida de un objeto teniendo en cuenta
el mantenimiento de la memoria.
1.Se crea el objeto.
2. Cuando se sale del scope y nada lo referencia (sin contar los
destructores) se separa como Listo para Destruir.
3. LLegado el momento se llama al destructor, si existe.
4.Posteriormente se verifica que este objeto no es
referenciado(incluyendo los destructores) de ser esta listo para ser
eliminado.
5.Llegado el momento la memoria dedicada al objeto es liberada.
Y en la documentacion de los destructores y Finalize() se enumera lo
siguiente:
1. Cuando un objeto es creado y tiene un destructor se coloca en una
lista.
2.Cuando se procede a recolectar "basura" si el objeto esta en la
lista, es movido hacia otra que contiene los que estan listos para
destruccion.
3. Cuando se ejecutan los destructores son al fin quitados de la
lista, y en una futura recoleccion seran eliminados.
He intentando representar esto en un organigrama, y he obtenido dos
distintos. ¿En el primer orden no se menciona nada de un segundo
proceso de recoleccion, y el ejemplo que funciona perfecto? No tengo
por que dudar de ninguna de las dos fuentes, pero no se corresponde,
al menos como yo lo veo. Si alguien pudiera aportar algo...
Gracias de antemano,
Leer las respuestas