我有一个我希望通过的测试,但垃圾收集器的行为并不像我假设的那样:
[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
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,obj对象应该是GC'd,因此我希望该WeakReference.IsAlive属性返回false.
似乎因为obj变量声明的范围与GC.Collect未收集的变量相同.如果我在方法之外移动obj声明和初始化,则测试通过.
有没有人对此行为有任何技术参考文档或解释?