Parámetros de C # por referencia y recolección de basura .net
He estado tratando de descubrir las complejidades del sistema de recolección de basura .NET y tengo una pregunta relacionada con los parámetros de referencia de C #. Si entiendo correctamente, las variables definidas en un método se almacenan en la pila y no se ven afectadas por la recolección de basura. Entonces, en este ejemplo:
public class Test
{
public Test()
{
}
public int DoIt()
{
int t = 7;
Increment(ref t);
return t;
}
private int Increment(ref int p)
{
p++;
}
}
el valor de retorno de DoIt () será 8. Dado que la ubicación de t está en la pila, entonces esa memoria no puede ser recolectada o compactada y la variable de referencia en Incremento () siempre apuntará al contenido apropiado de t.
Sin embargo, supongamos que tenemos:
public class Test
{
private int t = 7;
public Test()
{
}
public int DoIt()
{
Increment(ref t);
return t;
}
private int Increment(ref int p)
{
p++;
}
}
Ahora, t se almacena en el montón ya que es un valor de una instancia específica de mi clase. ¿No es esto posiblemente un problema si paso este valor como parámetro de referencia? Si paso t como parámetro de referencia, p apuntará a la ubicación actual de t. Sin embargo, si el recolector de basura mueve este objeto durante un compacto, ¿eso no estropeará la referencia a t en Incremento ()? ¿O el recolector de basura actualiza incluso las referencias creadas al pasar parámetros de referencia? ¿Tengo que preocuparme por esto? La única mención de preocuparse por la memoria compactada en MSDN (que puedo encontrar) se relaciona con el paso de referencias administradas a código no administrado. Espero que sea porque no tengo que preocuparme por ninguna referencia administrada en el código administrado. :)