Così ho questo semplicemente classe di Bell che sto testando garbage collection on:Garbage collection - Uno funziona ma non l'altro, come mai?
public class Bell
{
public void Ring()
{
Console.WriteLine("Ding ding");
}
}
Se corro questo segmento di codice di seguito, non ottiene garbage collection
class Program
{
private static WeakReference reference;
private static void Main()
{
Console.WriteLine("Starting");
var bell = new Bell();
reference = new WeakReference(bell);
bell = null;
GC.Collect();
Console.WriteLine("Object still alive: {0}", reference.IsAlive);
if (reference.Target == null)
{
Console.WriteLine("Bell is no more!");
}
else
{
{
var theBell = (Bell)reference.Target;
theBell.Ring();
}
}
Console.ReadLine();
}
}
Se invece controlla solo il riferimento.Ilivello come di seguito, è la raccolta dei rifiuti
class Program
{
private static WeakReference reference;
private static void Main()
{
Console.WriteLine("Starting");
var bell = new Bell();
reference = new WeakReference(bell);
bell = null;
GC.Collect();
Console.WriteLine("Object still alive: {0}", reference.IsAlive);
Console.ReadLine();
}
}
Potete dirmi come funziona?
Funziona lo stesso per me in LINQPad, ma quando l'ho provato in VS 2013 è stato sempre raccolto - debug/release, .NET 3.5, 4.0, 4.5, 4.5.1 – Ondra