2011-12-02 43 views
0

我知道dispose函數的作用是清除非託管資源。微軟模式方法與GC的矛盾?

但根據Microsoft's pattern(據我所知),他們這樣做:

他們打開了一個新的集中函數,它接受一個bool(isDispoisng);

如果True,所以從處置FUNC來到(使用using或別的東西) - 和它清除非託管和管理

如果false,它來自終結/析構函數。他殺死的只是非管理者。

我不明白爲什麼微軟的模式殺死managed如果isDispoisng==True(見粗體字)。

認爲的finilize應該殺只是非託管....

能否請你解釋一下嗎?

他們想在這方面達到什麼目的?

回答

4

因爲您的託管資源可能會持有可能需要處理的其他(非託管)資源。

任何實現IDisposable的對象都應該通過調用其Dispose方法來處置。

編輯:事實上,還需要消除事件處理程序連接,否則會阻止對象超出範圍並進行垃圾收集。

+1

此外,一些託管對象可以具有事件掛鉤,直到其處置後纔會釋放它。這些事件可以保持對象可達,從而阻止終結器運行。 –

+0

@Peladao所以CLASS的dispose將釋放託管對象,該對象持有對其他非託管資源的引用?我想說的是「這個」類的finilize,而不是其他類......所以......「我的dispose函數釋放MY非託管對象,還有我的託管對象,這些對象可能沒有其他非託管對象的引用。 ..正確嗎? –

+0

是的,Dispose實現應釋放所有非託管對象和事件處理程序,並對其擁有的任何(託管)對象調用Dispose,以便它們可以(遞歸地)執行相同操作。 – Peladao

0

最終確定涉及性能和延遲成本。理想情況下,我們應該試圖避免調用finalizer,對於任何給定的實例都應該避免。如果調用Dispose並且它清理非託管資源,這是可能的。

如果您對建議的處置模式的解釋比您在大多數MSDN內容中找到的內容更清晰,http://msdn.microsoft.com/en-us/magazine/cc163392.aspx是一個很好的開始。

順便說一句,從.NET 2.0開始,終結器的實現不再是清理非託管資源的推薦方法。相反,您應該使用SafeHandle,但very few "special" scenarios除外。