我想测试对象引用是否不正确,并编写了一个总是失败的测试。我将测试简化为以下行为:
[Test]
public void ScopesAreNotLeaking()
{
WeakReference weakRef;
Stub scope = null;
using (scope = new Stub())
{
weakRef = new WeakReference(scope);
}
scope = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Assert.That(weakRef.Target, Is.Null);
}
然而,这个测试用例在不使用该功能的情况下也能通过:
[Test]
public void ScopesAreNotLeaking()
{
WeakReference weakRef;
Stub scope = new Stub();
weakRef = new WeakReference(scope);
scope = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Assert.That(weakRef.Target, Is.Null);
}
使用的存根类足够简单:
class Stub : IDisposable
{
public void Dispose() {}
}
有人能解释一下这种行为吗,或者更好的是,有什么办法可以确保该对象被垃圾收集?
附注:如果之前已经有类似的问题,请见谅。我只查看了标题中包含使用的那些问题。