Basta Lasciatemi cominciare con una dimostrazione:Perché l'esistenza di un blocco try/finally interrompe il funzionamento del garbage collector?
[TestMethod]
public void Test()
{
var h = new WeakReference(new object());
GC.Collect();
Assert.IsNull(h.Target);
}
Questo codice funziona come previsto. Dopo che la garbage collection è finita, il riferimento in h
è annullato. Ora, ecco il colpo di scena:
[TestMethod]
public void Test()
{
var h = new WeakReference(new object());
GC.Collect();
try { } // I just add an empty
finally { } // try/finally block
Assert.IsNull(h.Target); // FAIL!
}
aggiungo un vuoto try/finally per il test dopo la linea GC.Collect()
ed ecco, l'oggetto debolmente fa riferimento non sono raccolte! Se il blocco try/finally vuoto viene aggiunto prima del la riga GC.Collect()
, il test passa comunque.
Cosa dà? Qualcuno può spiegare come esattamente i blocchi try/finally influenzano la durata degli oggetti?
Nota: tutti i test eseguiti in Debug. In Release entrambi i test passano.
Nota 2: per riprodurre l'app deve utilizzare come destinazione .NET 4 o il runtime .NET 4.5 e deve essere eseguito come 32 bit (o destinazione x86, o Qualsiasi CPU con opzione "Prefer 32-bit" controllato)
Non riproducibile su un programma di console equivalente (VS 2010, sia per il debug che per il rilascio) – xanatos
Si può verificare di nuovo per favore? Sono stato in grado di riprodurlo con VS2010 e VS2012 nel programma di console equivalente, in Debug. –
Forse dipende dalle subreleases della macchina .NET – xanatos