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