为了编写与弱引用相关的单元测试,我试图始终强制对象被垃圾收集。
但是,GC.Collect()
,I expect to force garbage collection,似乎并不一致。
请考虑以下示例代码。
static void Main (string [] args)
{
var obj = new object ();
var wRef = new WeakReference (obj);
obj = null;
GC.Collect ();
Console.WriteLine (wRef.IsAlive); // Prints false.
Console.ReadKey ();
}
在上面的代码中,似乎收集了对象,而在下面的代码中并非如此,尽管代码实际上是相同的。
static void Main (string [] args)
{
var obj = new object ();
var wRef = new WeakReference (obj);
obj = null;
GC.Collect ();
bool alive = wRef.IsAlive ? true : false;
Console.WriteLine (alive); // Prints true
Console.ReadKey ();
}
有人可以解释这种行为差异,并说明我们如何可靠地让对象被回收以便用弱引用进行一些测试?
更新
在没有附加调试器的情况下在发布模式下运行第二个代码段时(即在Visual Studio外部),它会输出False。