相关疑难解决方法(0)

你需要处理对象并将它们设置为null吗?

您是否需要处理对象并将它们设置为null,或者当垃圾收集器超出范围时它们是否会将它们清理干净?

.net c# garbage-collection dispose

300
推荐指数
9
解决办法
27万
查看次数

在.NET中使用后将对象设置为Null/Nothing

完成后,是否应该将所有对象设置为null(Nothing在VB.NET中)?

我理解在.NET中必须处理实现IDisposable接口的任何对象实例以释放一些资源,尽管对象在处理之后仍然可以是某种东西(因此isDisposed表单中的属性),所以我认为它仍然可以驻留在记忆中还是至少部分?

我也知道当一个对象超出范围时,它会被标记为收集准备好下一次垃圾收集器的传递(虽然这可能需要时间).

因此,考虑到这一点,将其设置为null加速系统释放内存,因为它不必解决它不再在范围内并且它们是否有任何不良副作用?

MSDN文章从未在示例中执行此操作,目前我这样做是因为我无法看到它的危害.但是我遇到了各种意见,所以任何评论都是有用的.

.net c# vb.net null memory-management

184
推荐指数
8
解决办法
9万
查看次数

符合条件的C#编译器是否可以优化本地(但未使用)变量(如果它是对象的唯一强引用)?

另见这些相关资源:


换一种说法:

可以在变量超出范围之前回收局部变量引用的对象(例如,因为变量已分配,但之后不再使用),或者该变量在变量退出之前保证不符合垃圾收集条件.范围?

让我解释:


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

11
推荐指数
1
解决办法
1872
查看次数