2013-08-19 30 views
3

您好我有一個對象是一次性的,我想知道什麼是更好的:C#object.Dispose()或對象= NULL

this.object.Dispose(); 

this.object = null; 

this.object.Dispose(); 
this.object = null; 
+3

類似的問題在這裏問,http://stackoverflow.com/questions/2926869/do-you-need-to-dispose-of-objects-and-set-them-to-null – Bearcat9425

回答

12

Dispose更好,甚至更好的方法是使用using塊內的對象並讓framewor k處置它。

對於:this.object.Dispose(); VS this.object = null;

對象設置爲null可能導致留出未管理的資源未設置。具有IDisposable的整個目標是確保未管理的資源在其使用後被處置

請參見:IDisposable - MSDN

主要採用此接口的是釋放非託管資源。 當不再使用該對象時,垃圾收集器會自動釋放分配給被管對象的內存。但是,並不是 可以預測垃圾回收何時發生。此外,垃圾收集器不知道非託管資源,如 窗口句柄或打開文件和流。

+0

我會說調用'Dispose ''或使用'using'塊是必須的.​​.....以防萬一類的創建者沒有實現一次性模式(析構函數不調用Dispose的糟糕情況)。 –

+0

Dispsoing更好,但如果你的資源緊張,我......,移動,那麼你應該調用null,所以你不必等待。但是如果將它設置爲null而沒有配置,在資源緊張的情況下是一個糟糕的主意,因爲您正在等待GC收集並釋放與它們相關的資源。如果對象使用硬件資源,則始終應該調用Dispose。 –

+0

@NickTurner,將對象設置爲'null',甚至通過GC收集並不能確保'Dispose'被調用。一個好的做法是在'Finalize'中調用'Dispose',但它可能不會被遵循。一般的規則是在將其設置爲空白之前將任何實現了「IDisposable」的任何東西「Dispose」(Task :)除外)* – Habib

2

你只需要Dispose對象 - 你不需要將它設置爲null,除非有檢查空值,並適當地迴應其他代碼。

0

object.Dispose()或對象= NULL

什麼是處置?任何實現IDisposable的類型都有此方法(儘管您可以編寫自己的公用方法)。

public class Test:IDisposable 
{ 
    public void Dispose() 
    { 
      //release resources here managed and unmanaged 
    } 
} 

現在,你已經實現了IDisposable所以最好的方式通過使用塊框架將採取所有資源照顧這樣做是

using (Test t = new Test()) 
{ 
} 

。你不必擔心。即使你在對象上釋放方法應調用Dispose()爲您

雖然另外,您也可以做

Test t = new Test(); 
t.Dispose(); 

現在怎麼樣將它設置爲空?

Test t = new Test(); 
t = null; 

它引用的對象不再可訪問,現在可以進行垃圾收集(託管資源)。您必須自己處理未管理的資源。

2

處置並不比設置爲空更好或更差。他們有不同的目的。

  • 將其設置爲空以釋放對該對象的引用,以便垃圾收集器可以收集該對象。請記住,如果從其他對象引用其他引用,則這可能沒有任何作用。範圍在這裏扮演重要角色(記住關閉,靜態對象引用,事件代表等)。
  • 如果開發人員在對象上實現了IDisposable,則調用Dispose()。我將IDisposable接口看作是一個「開發人員合同」,它允許我們看到「嘿,這個對象清理完畢後,還提供了一個公開的方法來明確清理它!」。

因爲,如果正確實施,對象應該調用Dispose()方法的終結,大部分的時間你並不需要顯式調用它。只要沒有對該對象的引用,就會由垃圾回收器調用終結器方法,並因此調用Dispose方法。