2011-06-29 37 views
2

我有兩個代碼示例,我想知道什麼是他們之間的deifference和哪個更好用明智的最佳實踐和性能:在C#中處理和設置引用null有什麼區別?

using (TestForm test = new TestForm()) 
{ 
test.ShowDialog(); 
} 

,另一個是:

TestForm test = null; 
try 
{ 
test = new TestForm(); 
test.ShowDialog(); 
} 
catch(Exception ex) 
{ 
} 
finally 
{ 
test = null; 
} 
+0

檢查我的答案,我錯誤地發佈它作爲評論:) –

回答

7

IDisposable接口定義Dispose方法,以及使用「using」語法的可能性。可以實現類的dispose方法來釋放資源,關閉數據庫連接以及任何類型的終結和清理。只需將類實例設置爲null將不會執行dispose方法中定義的任何代碼。作爲一個通用規則,如果一個類實現了IDisposable,那麼在完成類實例時應該調用dispose。

4

Dispose()用於釋放非託管資源。這個可能也可以在終結器中完成(可能會調用Dispose()),但不要依賴它。如果沒有完成,那麼你泄漏非託管資源。

設置對null的引用僅意味着特定引用不再指向該對象。它可以在一段時間後生活(甚至可以無限期地生活,如果你有另一個參考 - 好吧,如果你有多個對象的引用,那麼它可能會變得很難看)。

一般來說,當您完成這些操作後,請始終致電Dispose()IDiposable

using (var foo = new SomeDiposableObject()) { 
    // do something with foo 
} 
-1

IDisposable模式是一個對象,可以消耗及時免費非託管和託管資源的機制:如果你將它們包裝成using聲明更容易。

模式實現的典型方法如下:

public void Dispose() //Implementes the IDisposable interface 
{ 
    this.Dispose(true); 
    GC.SupressFinalize(this); //All resources have been released, no need to run the finalizer. We make the GC's life a little easier; 
} 

protected void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     //Relesase managed resources. 
    } 

    //Release unmanaged resources. 
} 

~MyDisposableObject() //finalizer 
{ 
    this.Dispose(false) 
} 

這裏要注意的一點是,資源通過Dispose方法釋放是非常相似的,你在邏輯上希望在一個找一下終結者。它不是在終結直接完成主要有兩個原因:

  1. 終結不確定性的順序執行。這就是爲什麼我們不處理來自終結器Dispose(false))的管理資源,因爲對象所持有的一些或所有受管資源可能已在對象本身之前完成。這對非託管資源來說並非如此,因爲根據定義,它們將永遠不會被GC最終確定。

  2. 我們不知道終結器運行(它是由GC)。

的基本思路是,實施IDisposable對象爲任何消費者說一個牌子:「哎,我持有一定量的非託管和/或管理的資源最終將被釋放時GC決定我不再有用,但如果您及時需要這些資源,請撥打Dispose(),我會很樂意提供。「。

另一方面,將參考變量設置爲null根本不釋放任何資源。 如果從對象中刪除的引用是唯一指向該對象的引用,那麼對象最終將被GC收集,並且託管和非託管資源將被釋放(何時,是否有人猜測)。

如果還有更多的實時引用仍然指向該對象,那麼該對象將生活一個,並且任何資源都不會被釋放。

相關問題