Los tipos por referencia almacenan la dirección de los datos, son punteros a una pila. Cuando uno de estos punteros cambia de dirección en la pila, no se libera esa memoria, esto ya lo hace automáticamente el recolector de basura. Sabiendo esto si creamos la siguiente estructura.
struct Numbers
{
public int val;
public Numbers(int _val)
{
val = _val;
}
public override string ToString()
{
return val.ToString();
}
}
y hacemos la siguiente llamada en main
Numbers n1 = new Numbers(0);
Numbers n2 = n1;
n1.val += 1;
n2.val += 2;
Console.WriteLine("num1 = {0}, num1 = {1}", n1, n2);
El resultado seria num1 = 1 y num2 = 2, en este caso el tipo es un value Type, (que iba con trampa) si quereís ver como influye la asignación de dos punteros a la misma zona de memoria cambiad la palabra struc por class y ya tenemos un reference type, en cuyo caso el resultado será num1=3 y num2=3
Como anecdota: Todavía recuerdo el examen de programación en el que me bajaron la nota a notable porque al eliminar un nodo de una lista se me olvidaba liberar la memoria.