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

标签 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);
    }

然而,这个测试在不使用的情况下执行相同的操作,通过了:

    [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);
    }

使用的 stub 类很简单:

class Stub : IDisposable
{
    public void Dispose()  {}
}

有人可以向我解释这种行为,或者 - 甚至更好 - 知道如何确保对象被垃圾收集吗?

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

最佳答案

using 不是为了强制垃圾收集而设计的,而是为了确保调用 dispose。 Dispose 允许您释放非垃圾收集的资源,如文件句柄。当 C# 良好且准备就绪时,就会发生垃圾收集。

关于c# - 垃圾收集器不会收集使用创建的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6254865/

相关文章:

c# - 如何设置SqlDependency来监控多个表

C# 将动态转换为字符串的最佳方法

c# - 在运行时通过变量更改 TableLayoutPanel 的单元格颜色?

c# - System.LocalDataStoreElement[] 内存分配

c# - 启动一个新线程——我需要关心垃圾回收吗

java - 堆增长和下降

c# - 由于 Microsoft 教程中的代码中的保护级别错误而无法访问

c# - 用户回复电子邮件。如何从用户电子邮件中获取数据?

java - 字符串对象及其文字是否被垃圾收集?

android - 为什么使用 Jacksons ObjectMapper Android 垃圾收集次数如此之多?