2011-02-03 51 views
-1

從我的理解的接口資源被釋放,一旦引用計數的接口上獲取到0我需要在.NET中釋放私人界面字段嗎?

考慮以下私有字段:

private IMyInterface _field = new DisposableObject() 

我是否需要明確的仍然自由這個領域了在類例如讓班級執行IDisposable並將其釋放到Dispose?或者它會自動釋放,因爲我正在使用一個接口?

我在Delphi中有類似的情況,它導致了一個內存泄漏,讓我有點困惑,因爲我一直認爲接口對象不需要被釋放(因爲它們是引用計數)。爲了修復內存泄漏,我必須存儲混凝土類型並將其釋放。

我想我真的得到的是爲什麼我需要釋放它,如果我使用的接口?

回答

1

.NET不使用引用計數來確定何時資源被垃圾收集。當程序中任何位置沒有對象時,將收集對象。這是通過對象圖遍歷而不是引用計數完成的,因此循環引用不會泄漏資源。

如果具有非託管資源的類編碼正確,則對Dispose的調用將是可選的。無論何時發生垃圾收集,資源都將在終結器中清除。

Dispose不影響對象的生命週期。在沒有對剩餘對象的實時引用之後,它會在某個時間收集垃圾。

對象的生命週期也不受引用它的變量是接口還是對象類型的影響。將變量設置爲null將刪除活動引用,如果沒有其他對象的引用,則允許收集對象。

+0

+1 - 這幾乎是我正在尋找的解釋。在Delphi中,如果我在正常情況下使用接口來引用資源,我不需要明確地釋放它。 – James 2011-02-03 15:01:39

1

當您的課程包含一次性字段,由您的課程管理 - 我的意思是,它們在您的課程內部進行了授課 - 然後您的課程也應實施IDisposable接口。

如果您不再需要處置一次性物品,您不確定何時物品將被丟棄。

3

我想我真的得到的是爲什麼我需要釋放它,如果我使用的接口?

接口只告訴你如何正確處理資源,不做到這一點。你必須自己決定。

一個好的經驗法則是,誰最初請求資源的人也負責處置它。如果您的對象擁有該資源,那麼它應該在資源本身處置時(或更早,如果它不再需要該資源)處置資源。如果它不擁有資源,但只是使用它,那麼它通常不應該處理它。

+0

+1很好的解釋。 – James 2011-02-03 14:55:22

0

使用接口並不意味着您不需要應用正確的處理技術。

0

是的,你應該實現IDisposable(如何做到這一點取決於你的班級,看看here的一些很好的建議)。

接口與否,您創建了該對象,因此您(通常)負責清理它。既然它是一次性的,那就是要走的路。

由於垃圾收集,傳統意義上的內存泄漏幾乎是不可能的,但一次性對象通常會處理其他資源(如文件,數據庫連接,COM對象或其他),因此資源泄漏仍是可能的。