【发布时间】:2015-07-17 04:57:15
【问题描述】:
此程序将“True”打印到控制台。
分配一个对象,对其进行 WeakReference,超出块范围,并检查 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。块范围似乎不相关。 这是在 Debug 模式下尝试not。
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
【问题讨论】:
-
您是否尝试将“Force”作为参数传递给
GC.Collect? -
Regular .Net 的行为类似 - 您需要在发布模式下编译(或“csc /debug-sample.cs”,如果使用命令行)才能实现 - Mono 的行为可能类似以简化调试.
-
@Atomosk 我尝试了“强制”,但结果相同。