У меня есть тест, который я ожидал пройти, но поведение сборщика мусора не так, как я предполагал:
[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
}
В этом примере объект obj должен быть GC'd, поэтому я ожидаю, что свойство WeakReference.IsAlive вернет false.
Похоже, что поскольку переменная obj была объявлена в той же области, что и GC.Collect, она не собирается. Если я перемещаю объявление obj и инициализацию вне метода, тест проходит.
Есть ли у кого-нибудь техническая справочная документация или объяснение этого поведения?