以下是相关资源:
在这个代码示例中,我显然必须考虑到新创建的
(请注意,我仅使用
这个代码示例与之前的不同之处在于,新建的
问题:如果符合规范的C#编译器看到
请参阅这些相关资源:
- .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#编译器看到
unusedLocalVar
只在一个地方被使用,即作为WeakReference
构造函数的参数,是否允许将Case_2
的前两行优化成Case_1
的形式?即Case_2
中的断言是否可能失败?
unusedLocalVar=null
通常会导致性能下降。 - H HGC.KeepAlive
的提示,我认为 MSDN 文档对我的问题给出了 95% 的答案。-- @Henk Holtermann: 这似乎比GC.KeepAlive
不安全;聪明的编译器不能将这样的null
赋值识别为多余的并将其优化掉吗? - stakx - no longer contributing