2010-01-08 68 views
1

我有一個庫,它返回由IDictionary,IList和基元類型(字符串和整數)組成的分層列表。目前我無法改變這些數據的返回方式。C#垃圾收集器問題

我有另一個強類型的類正在使用這些數據並將其轉換爲業務對象。返回的數據中有一個「屬性」列表,我想將其導入到強類型類中。然後我可以處理層次結構。

我的問題是這樣的:如果我這樣做:

MyCustomClass.Properties = HierarchicalData["some_name"] 

哪裏MyCustomClass是我的強類型的類,並且HierarchicalData是IDictionary的數據時,我再打會發生什麼:

HierarchicalData = null 

燦分層數據被處置和釋放?在這種情況下,「some_data」是另一個字典,所以技術上這是所有需要保留的。我需要做的,而不是導入一個明確的副本,如:

MyCustomClass.Properties = HierarchicalData["some_name"].ToDictionary<string, string>(/* selector */) 

澄清:我不擔心包含的屬性被垃圾收集的字典。我想確保HierarchicalData __can__可以被刪除,因爲它非常大,我需要與其中的幾個一起工作。

+1

'Dictionary'沒有實現'IDisposable',所以不需要(也不能)處理。你只是想讓它由GC收集。 – SLaks 2010-01-08 02:15:24

+0

是的,這裏當我說處置我的意思超出範圍,因此收集的候選人,而不是在Dispose()。 – GrayWizardx 2010-01-08 02:17:22

回答

2

是的。一旦沒有提及HierarchicalData,它將成爲收藏的候選人。

由於您對「some_name」鍵存儲的數據進行了引用,因此不會收集該特定元素(另一個字典)。然而,就GC而言,其他未引用的部分將根本沒有根據,並在某個時候完成。

+0

真棒,那是我想的但想確定的。 – GrayWizardx 2010-01-08 02:18:33

1

這將按預期工作。因爲您將在另一個地方創建對由HierarchicalData["some_name"]引用的字典的引用,垃圾收集器將爲您保留它。

你絕對不需要複製字典。

1

假設該類返回標準Dictionary<TKey, TValue>,那麼您可能不需要執行其他任何操作。

對象可能不包含對包含它們的字典的引用,因此它們可能不會阻止收集字典。
但是,沒有檢查就沒有辦法確定;您應該檢查Visual Studio調試器的Watch窗口中的對象(或查看源代碼)並查看它們是否引用該字典。

+0

是的,我只是想實施最可能的方式,然後再將其放入測試設備並在夜間進行輪廓測試。 – GrayWizardx 2010-01-08 02:19:42

0

您不需要執行副本。

線:

MyCustomClass.Properties = HierarchicalData["some_name"] 

分配一個參考,並同時對對象的參考是活的,它不會被垃圾收集。

0

是否可以處理和釋放分層數據?

您的意思是說GC?不是在這種情況下,因爲它是由你的對象引用的。 GC不會搞亂它。