另请参阅这些相关资源:
- .NET 垃圾收集器是否对代码进行预测分析?(关于堆栈溢出)
- 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);
}
与前一个代码示例相比,此代码示例的主要变化是 new'edobject
被局部变量 ( unusedLocalVar
) 强引用。weakRef
但是,在创建弱引用 ( )后,该变量将不再使用。
问题:是否允许符合标准的 C# 编译器将 的前两行优化为仅在一个地方使用的Case_2
那些,即作为构造函数的参数?即有没有可能断言 in可能会失败?Case_1
unusedLocalVar
WeakReference
Case_2