c# - 为什么未收集未引用的对象?

标签 c# mono

此程序向控制台打印“True”。

分配一个对象,对其进行 WeakReference,超出 block 范围,并检查 WeakReference.IsAlive。

public static void Main (string[] args)
{
    Test ();
}

static void Test ()
{
    WeakReference wref = null;

    { // block scope
        var obj = new object ();
        wref = new WeakReference (obj);
    }

    // obj is out of scope
    // Console.WriteLine (obj);

    GC.Collect ();

    Console.WriteLine (wref.IsAlive); // => True
}

为什么没有收集到 obj,尽管 obj 超出了范围?

程序由Mono 3.12.0编译。

编辑:

对不起,不恰当的例子。

以下程序也打印 True。 block 范围似乎不相关。 这是调试模式下尝试的。

    public static void Main (string[] args)
    {
        Test ();
    }

    static void Test ()
    {
        WeakReference wref = null;

        var obj = new object ();
        wref = new WeakReference (obj);
        obj = null;

        GC.Collect ();

        Console.WriteLine (wref.IsAlive); // => True
    }

$ mcs -debug- Program.cs
$ mono Program.exe

最佳答案

我猜是因为你在调试器中运行。

尝试运行发布版本,并在调试器之外手动运行它。

关于c# - 为什么未收集未引用的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31468637/

相关文章:

c# - 作为 UnmanagedFunctionPointer 传递给 C 的函数在哪里执行?

c# - String.Format 计算预期参数的数量

c# - 为什么 .Net FCL 同时在 List<T> 类中实现通用和非通用接口(interface) IList 和 IList<T>?

c# - 存储凭据以供自动使用

asp.net - nginx 中用于多个 FastCGI ASP.NET Mono 后端的版本化 URL

c# - 将图像添加到单元格 - iTextSharp

c# - 我可以在 C# DocumentDb 驱动程序中使用多态/继承吗

c# - Monodevelop:嵌入式资源行尾 CRLF 转换为 LF?

c# - Mono:是否支持更改线程的优先级?

c# - 在 C# 中运行 Linux 控制台命令