2010-09-14 105 views
2

我正在用C#写Silverlight中的一个软件。GC.Collect()会在什么情况下清除对象?

我知道GC.Collect会收集对象和控件,如果它们是未引用的,但我不确定非引用是什么意思。

我知道,在Silverlight中,我必须从布局中删除控件(称为“控件A”),取出所有事件处理程序,然后将该对象设置为空,以便它不引用该对象。例如:

1)如果“控件A”包含其他控件:“控件B”,“控件C”,并且它们可能在某处具有下标事件处理程序。

GC.Collect()还会收集“对照A”吗?那么“控制B”“控制C”如何?

我是否必须从“控件A”中实际删除包含“控件B”和“控件C”以及从“控件A”中删除“控件B”“控件C”的所有内容以使其收集?

2)说是否有一个“控制D”继续ComboBox,并且ComboBox有很多ComboxBoxItem。

我必须清除()出所有的ComboxBoxItem,以便这些ComboxBoxItem将被收集?

或者当我从“控件D”中删除组合框时,也将取出ComboxBoxItem?

我种在C删除的困惑++,因为在C++中我可以删除整个对象及其包含的一切......

+5

有很多情况下你必须自己调用'GC.Collect();'。 – Nate 2010-09-14 16:23:24

+0

这与Silverlight或C#无关,所以我更改了标签。 – 2010-09-14 16:33:05

回答

2

如果控件A或任何包含的控件具有事件,并且其他某些类订阅了这些事件,则这意味着:控件A(B,C)具有对另一个类(订阅者)的引用。这并不妨碍收集这些控件。如果控制A(B,C)订阅了某个D类事件,这意味着D类对A(B,C)有引用。这可以防止收集这些控件。

修正了控件A和子控件之间的内部相互引用,GC足够聪明,可以识别并收集所有这些内容。

+0

非常感谢,这是我想知道的。因为我的所有控件都被分解成许多小控件并将它们放在一起,所以如果必须一个一个地删除它们是一大痛苦:) – King 2010-09-14 16:39:45

+0

尽管事件订阅者不必严格控制对象的引用tom已经订阅了它的事件,这对于事件订阅者来说是不是很正常?一些事件订阅者可能会使用弱引用来避免使订阅对象保持活动状态,但没有某种参考,订阅者将如何退订自己? – supercat 2010-09-14 16:59:23

+0

supercat:我不太了解弱引用,并且在必要时更喜欢取消订阅:我的主要语言是C++,我永远不会忘记进行清理操作:) – 2010-09-14 18:00:54

1

,如果它不被引用(直接或间接的对象时,才会收集)由范围内的根变量(在堆栈上或静态)执行。换句话说,如果A引用B和B引用A,他们都将被收集。

http://msdn.microsoft.com/en-us/library/ee787088.aspx

垃圾收集器使用以下信息来确定对象是否是活的:

堆栈根。由即时(JIT)编译器和堆栈助手提供的堆栈变量。

垃圾收集手柄。指向托管对象的句柄,可以由用户代码或公共语言运行库分配。

静态数据。应用程序域中可能引用其他对象的静态对象。每个应用程序域都会跟踪其静态对象。

+0

实际上我之前读过,但我不太明白......这就是为什么我在这里问这里 – King 2010-09-14 16:48:10

+0

那么,希望解释让报价有意义。 – 2010-09-14 18:11:21

相关问题