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
法によるリソースの解放はあなたが論理的に見つけることを期待するものに非常に似ているということですファイナライザ。
ファイナライザは決定論的順序で実行されていません:それは、ファイナライザに直接起因する2つの主な理由で行われていません。そのため、オブジェクトが保持する管理対象リソースの一部またはすべてがオブジェクト自体よりも前にファイナライズされている可能性があるため、ファイナライザ(Dispose(false)
)から管理対象リソースを処分しないのはこのためです。これは、定義によって、GC
によって決裁されることはないため、管理されていないリソースについては当てはまりません。
ファイナライザを実行したときにと表示されません(GC
までです)。
基本的な考え方は、IDisposable
を実装するオブジェクトが言って任意の消費者のための記号であるということである:「はちょっと、私は最終的に解放され管理されていないおよび/または管理対象リソースの一定量につかまっていますGC
は私がもう役に立たないと判断しますが、そのリソースをタイムリーに返す必要がある場合は、Dispose()に電話してください。 "。
一方、参照変数をnull
に設定しても、リソースはまったく解放されません。 オブジェクトから削除した参照のみがオブジェクトである場合、オブジェクトは最終的にGC
によって収集され、管理対象リソースと非管理対象リソースは解放されます(anyonesが推測される場合)。
ライブ参照がまだオブジェクトを指していた場合、オブジェクトは1つのライブになり、リソースはすべて解放されません。
私の答えをチェックしてください、私は間違ってコメントとして投稿しました:) –