对象列表A
保存在缓存中。在某一点上传递这些对象并使用A
,B
的属性。 B是一种大型数据结构。 A
需要保留在缓存中,但在某个时间点B
不是必需的 - 因为它很大,我们想让它被垃圾收集。
设置Dispose
的A上的A.B=null
方法是否允许垃圾收集器收集该对象,如果没有其他内容保存对B
的引用(即我们将在{{1}上调用Dispose当我们不再需要A
时,或者可以使用using语句来实现相同的效果)。
在这种情况下,Dispose用于控制托管对象的生命周期,即可以通过CG释放它。
答案 0 :(得分:1)
Dispose是始终用于控制托管对象的生命周期 - 在调用dispose之后访问对象是一个坏主意,如果你这样做,许多BCL对象将抛出异常。没有引用对象是垃圾收集的先决条件,但GC足够智能来检测图形。
例如,如果A是孤儿而且 else 没有任何对B的引用,那么也会收集B.另一方面,如果其他东西持有对B的引用,则A不是孤儿,也不会被收集。
取消引用并不强制进行垃圾回收,也不应该强制进行垃圾回收。垃圾收集器非常智能,只有在存在实际内存压力时才能运行集合,因为解除分配是很昂贵的。
<强>更新强>
看起来真正的问题是&#34;如果我想在没有实际释放A的情况下释放AB,可以通过调用A.Dispose()来做到这一点吗?答案是&#34;不,从未&#34;
A.Dispose
表示A
对所有意图和目的都是死的。最好添加一个名为A.CloseB()
的方法,实际调用B.Dispose()
然后将其设置为null
,并让GC在必要时收集它。