垃圾收集和引用C#

时间:2012-04-20 11:07:48

标签: c# collections garbage-collection

我有一个设计,我不确定垃圾收集是否会正确发生 我有一些神奇的苹果,有些是美味的,有些是坏的。

我有一本字典:BasketList = Dictionary <basketID,Basket>
(篮子清单)。

每个Basket对象中都有一个Apple,每个Basket都存储对象AppleSeperation的引用。

{{1存储2个字典,AppleSeperationYummyApples = <basketID,Apple>,所以当我被问到我知道苹果在哪里时。

一个BadApples = Dictionary<basketID,Apple>对象存储Apple,它指向购物篮和商店,以及指向购物篮中的Apple。

我的问题是,如果我从BasketsImIn = Dictionary<ID,Basket>删除一个购物篮并确保从BasketList和/或BadApples删除Apple,垃圾收集是否会正常发生,或者是否会一些乱七八糟的参考文献?

2 个答案:

答案 0 :(得分:2)

你仔细思考这个问题是正确的;拥有各种引用不仅会影响垃圾收集,还会影响应用程序的正常运行。

但是,只要您小心删除已设置的所有引用,并且没有任何其他独立变量保留引用,垃圾收集器就会完成其工作。

GC在收集未引用的对象时实际上非常复杂。例如,它可以收集两个相互引用的对象,但在应用程序中没有其他“活动”引用。

答案 1 :(得分:1)

有关垃圾收集的基本知识,请参阅http://msdn.microsoft.com/en-us/library/ee787088.aspx

从上面的链接中,当垃圾收集发生时......

  1. 系统物理内存不足。
  2. 托管堆上已分配对象使用的内存超过可接受的阈值。这意味着托管堆上已超出可接受内存使用量的阈值。随着流程的运行,该阈值会不断调整。
  3. 调用GC.Collect方法。几乎在所有情况下,您都不必调用此方法,因为垃圾收集器会持续运行。此方法主要用于独特的情况和测试。
  4. 如果您正在进行正确的清理,那么您无需担心!