2010-09-14 107 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

相關問題