此程序向控制台打印“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/