Die Garbage Collection sollte das Objekt entfernt haben, aber WeakReference.IsAlive gibt weiterhin true zurück

Ich habe einen Test, von dem ich erwartet habe, dass er bestanden wird, aber das Verhalten des Garbage Collector ist nicht so, wie ich angenommen habe:

[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
}

In diesem Beispiel ist dieobj Objekt sollte GC'd sein und daher würde ich das erwartenWeakReference.IsAlive Eigentum zurückzugebenfalse.

Es scheint, dass weil dieobj Variable wurde im selben Gültigkeitsbereich wie die deklariertGC.Collect es wird nicht gesammelt. Wenn ich die obj-Deklaration und -Initialisierung außerhalb der Methode bewege, besteht der Test.

Hat jemand eine technische Referenzdokumentation oder Erklärung für dieses Verhalten?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage