垃圾收集器不会收集使用创建的对象

MZy*_*tza 6 c# garbage-collection

我想测试不正确的对象引用并编写一个总是失败的测试.我将测试简化为以下行为:

    [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);
    }
Run Code Online (Sandbox Code Playgroud)

然而,该测试在不使用的情况下执行相同的操作:

    [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);
    }
Run Code Online (Sandbox Code Playgroud)

使用的存根类很简单:

class Stub : IDisposable
{
    public void Dispose()  {}
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这种行为,或者 - 甚至更好 - 有一个想法,如何确保对象被垃圾收集?

PS:如果之前有过类似的问题,请耐心等待.我只检查了标题中使用的那些问题.

Pat*_*ick 5

使用不是为了强制垃圾收集,而是为了确保调用dispose.Dispose允许您释放非垃圾收集的资源,如文件句柄.垃圾收集发生在c#良好且准备就绪时.


Sve*_*ven 2

我怀疑可能是本地的using语句引入的。使用 ildasm 查看函数中对该对象的所有引用是否在调用之前真正清除GC.Collect。还尝试将 using 位放在返回弱引用的单独函数中。