Coleta de lixo deve ter removido objeto, mas WeakReference.IsAlive ainda retornando true
Eu tenho um teste que eu esperava passar, mas o comportamento do Garbage Collector não é como eu presumi:
[Test]
public void WeakReferenceTest2()
{
var obj = new object();
var wRef = new WeakReference(obj);
wRef.IsAlive.Should().BeTrue(); //passes
GC.Collect();
wRef.IsAlive.Should().BeTrue(); //passes
obj = null;
GC.Collect();
wRef.IsAlive.Should().BeFalse(); //fails
}
Neste exemplo, oobj
objeto deve ser GC'd e, portanto, eu esperaria oWeakReference.IsAlive
propriedade para retornarfalse
.
Parece que porque oobj
variável foi declarada no mesmo escopo que aGC.Collect
não está sendo coletado. Se eu mover a declaração obj e a inicialização fora do método, o teste passa.
Alguém tem alguma documentação de referência técnica ou explicação para esse comportamento?