您是否需要处理对象并将它们设置为null,或者当垃圾收集器超出范围时它们是否会将它们清理干净?
完成后,是否应该将所有对象设置为null(Nothing在VB.NET中)?
我理解在.NET中必须处理实现IDisposable接口的任何对象实例以释放一些资源,尽管对象在处理之后仍然可以是某种东西(因此isDisposed表单中的属性),所以我认为它仍然可以驻留在记忆中还是至少部分?
我也知道当一个对象超出范围时,它会被标记为收集准备好下一次垃圾收集器的传递(虽然这可能需要时间).
因此,考虑到这一点,将其设置为null加速系统释放内存,因为它不必解决它不再在范围内并且它们是否有任何不良副作用?
MSDN文章从未在示例中执行此操作,目前我这样做是因为我无法看到它的危害.但是我遇到了各种意见,所以任何评论都是有用的.
另见这些相关资源:
- .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) ...
}
Run Code Online (Sandbox Code Playgroud)
在这个代码示例中,我显然必须计划object垃圾收集器回收new'ed的可能性; 因此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 …Run Code Online (Sandbox Code Playgroud) .net c# garbage-collection weak-references compiler-optimization