2011-06-29 2 views
2

私は2つのコードサンプルを持っていると私は彼らとどの賢明なベストプラクティスとパフォーマンスとして使用することをお勧めします間deifferenceが何であるかを知りたい:Disposeと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() d)、おそらく醜いでしょう。

完了したら、通常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. ファイナライザは決定論的順序で実行されていません:それは、ファイナライザに直接起因する2つの主な理由で行われていません。そのため、オブジェクトが保持する管理対象リソースの一部またはすべてがオブジェクト自体よりも前にファイナライズされている可能性があるため、ファイナライザDispose(false))から管理対象リソースを処分しないのはこのためです。これは、定義によって、GCによって決裁されることはないため、管理されていないリソースについては当てはまりません。

  2. ファイナライザを実行したときにと表示されません(GCまでです)。

基本的な考え方は、IDisposableを実装するオブジェクトが言って任意の消費者のための記号であるということである:「はちょっと、私は最終的に解放され管理されていないおよび/または管理対象リソースの一定量につかまっていますGCは私がもう役に立たないと判断しますが、そのリソースをタイムリーに返す必要がある場合は、Dispose()に電話してください。 "。

一方、参照変数をnullに設定しても、リソースはまったく解放されません。 オブジェクトから削除した参照のみがオブジェクトである場合、オブジェクトは最終的にGCによって収集され、管理対象リソースと非管理対象リソースは解放されます(anyonesが推測される場合)。

ライブ参照がまだオブジェクトを指していた場合、オブジェクトは1つのライブになり、リソースはすべて解放されません。

関連する問題