2016-07-27 38 views
-3

方法我在C#處置相關的一些疑慮和終結對此我下面提的確切條件: - 從非託管資源什麼是我們必須調用dispose託管代碼

1.Apart,什麼是確切的需要使用配置方法。如果有垃圾收集器釋放內存,我們爲什麼使用配置來釋放託管代碼的內存。

2.此外,爲什麼不推薦finalizer.Microsoft會有一些原因來開發終結器功能。在我訪問過的大多數網站中,建議不建議使用終結器。是什麼原因。

3.有時,我們只使用object.dispose來釋放,而有時我們使用idisposable接口。爲什麼?

4.我們必須調用dispose方法的確切條件是什麼?

+0

可能有關閉這個問題的可能性,我仍試圖編輯以便於理解人們想要問什麼 –

+3

感覺很寬泛。你爲什麼不問四個不同的問題(第一個和第二個問題已經被問到99%)?最後2個問題不清楚(考慮添加一些僞代碼/實際代碼來展示你的意思)。 – Sinatr

+0

由非託管代碼分配的內存不由GC發佈。終結者應該由非託管資源的類來實現,但客戶應該立即調用Dispose,以便終結者不需要運行。沒有'Object.Dispose'方法。 – Lee

回答

0

爲了您#1:爲你正確地對您的問題寫了,主要的原因使用處置是免費資源從非託管資源(如文件句柄,數據庫連接等),但有一個更在這種情況下,我們可以調用dispose來完成與託管資源相關的一些事情,這就是斷開事件處理程序。關於這個here有一個很好的解釋。在回答你的#2,不建議

終結,因爲他們介紹的性能問題,正因爲如此,你應該避免使用他們,如果你可以使用更好的解決方案。從「有效C#」由比爾·瓦格納在這個fragment說:

終結是確保你的對象總是 有辦法釋放非託管資源

和防禦機制,如果你繼續閱讀...

終結器是保證由給定類型的對象分配的非託管資源最終被釋放的唯一方法。但是,終結器在非確定性時間執行,因此您的設計和編碼實踐應儘量減少創建終結器的需求,並且最大限度地減少執行確實存在的終結器的需求。

因此,終結器似乎是唯一可以確保非託管資源被釋放的事情,所以也許這是您尋找的原因(我並不真正瞭解Microsoft的理由它,抱歉)。

回答您的問題#3我需要一個確切的代碼示例來說明您的意思,但我會嘗試猜測。我想你說的是接下來的兩個不同的方案:

  • 調用myObject.Dispose()使用它,明確的方式之後。例如,我們可以創建一個實例,使用它,然後調用處置

    myObject = new MyObject() 
    
    // More code here... 
    
    myObject.Dispose(); 
    

    如果你是確保創建您的實例,並調用到之間處置方法有這將是確定在您的代碼中也不例外,這可能會導致Dispose錯過。使用

    try { 
        MyObject myObject = new MyObject() 
        (...) 
    
    } 
    catch (Exception) { 
        // manage exception 
    } 
    finally { 
        if (myObject != null) 
        myObject.Dispose(); 
    } 
    
  • 調用處置使用IDisposable的接口,通過:當然,你可以隨時使用終於塊。它基本上是相同的,與以前的finally塊,但它會「自動」創建:

    using (MyObject myObject = new MyObject()) { 
        // your code here 
    } 
    

您可以檢查docs here

並回答你的#4。我認爲這是一個good answer,但不要忘記閱讀評論。所以,總之,如果它有一個配置方法,它應該被調用。

+0

嗨,BitExodus,非常感謝你的寶貴答案。我們不能使用Dispose來顯式釋放託管資源的內存。我的意思是如果我想釋放託管資源對象的內存,我不能使用dispose。 – Ram

+0

當對象的實例不再需要時,託管類使用的內存由垃圾收集器聲明。在這種情況下調用「Dispose」方法將不起作用,因爲它用於非託管資源。如果您需要釋放託管實例的內存,最好的策略是讓它超出範圍或分配一個「空」值,以便垃圾收集器將聲明該實例使用的內存。 – BitExodus

+0

嗨BitExodus,一些相關的帖子建議我們可以使用配置託管代碼以及明確釋放內存。 – Ram

相關問題