我有一个测试,本来期望它能通过,但垃圾回收器的行为并不像我预想的那样:
[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
对象应该被垃圾回收,因此我期望WeakReference.IsAlive
属性返回false
。似乎由于
obj
变量在与GC.Collect
相同的作用域中声明,它没有被回收。如果我将obj的声明和初始化移到方法之外,测试就会通过。有没有人对这种行为有任何技术参考文档或解释?
obj
,所以允许在其他方法调用之间重新排序操作。尝试添加类似于Console.WriteLine(obj == null)
的内容,以防止编译器这样做。 - ServyConsole.WriteLine
来记录IsAlive
参数,而不是Should()
。 - JaredPar