另请参阅以下相关资源:
- .NET垃圾收集器是否执行代码的预测分析? (在Stack Overflow上)
- WP7:GC何时将局部变量视为垃圾 (关于MSDN的博客文章)
换一种说法:
可以由本地引用的对象 变量在回收之前被回收 变量超出范围(例如。 因为变量已分配,但是 然后不再使用),或者就是这样 对象保证不符合条件 垃圾收集直到变量 超出范围?
让我解释:
void Case_1()
{
var weakRef = new WeakReference(new object());
GC.Collect(); // <-- doesn't have to be an explicit call; just assume that
// garbage collection would occur at this point.
if (weakRef.IsAlive) ...
}
在这个代码示例中,我显然必须计划新的可能性 object
被垃圾收集者收回;因此 if
声明。
(注意我正在使用 weakRef
仅用于检查是否为新人 object
还在。)
void Case_2()
{
var unusedLocalVar = new object();
var weakRef = new WeakReference(unusedLocalVar);
GC.Collect(); // <-- doesn't have to be an explicit call; just assume that
// garbage collection would occur at this point.
Debug.Assert(weakRef.IsAlive);
}
这个代码示例与前一个代码示例的主要变化是新的 object
被局部变量强烈引用(unusedLocalVar
)。但是,这个变量在弱参考之后永远不会再次使用(weakRef
) 已经被创造了。
题: 是否符合C#编译器允许优化前两行 Case_2
进入那些 Case_1
如果它看到了 unusedLocalVar
只用在一个地方,即作为参数 WeakReference
构造函数?即是否有任何可能的断言 Case_2
可能会失败?