让我从一个演示开始:
[TestMethod]
public void Test()
{
var h = new WeakReference(new object());
GC.Collect();
Assert.IsNull(h.Target);
}
此代码按预期工作。垃圾回收结束后,in 的引用h
无效。现在,这里的转折:
[TestMethod]
public void Test()
{
var h = new WeakReference(new object());
GC.Collect();
try { } // I just add an empty
finally { } // try/finally block
Assert.IsNull(h.Target); // FAIL!
}
我在该行之后向测试添加了一个空的 try/finally 块GC.Collect()
,瞧,弱引用的对象没有被收集!如果在该行之前添加了空的 try/finally 块GC.Collect()
,则测试通过。
是什么赋予了?谁能准确解释 try/finally 块如何影响对象的生命周期?
注意:所有测试都在 Debug 中完成。在 Release 中,两个测试都通过了。
注意 2:要重现该应用程序必须以 .NET 4 或 .NET 4.5 运行时为目标,并且必须以 32 位运行(目标 x86 或选中“首选 32 位”选项的任何 CPU)