2009-10-16 15 views
5

ここにコードはMSDNです。私はなぜ仕事がちょうどここで通常のDispose()メソッドで行われていないのか分かりません。 Dispose(bool)メソッドを使用する目的は何ですか?誰がここでDispose(false)と呼ぶでしょうか?C#でDispose(IsDisposing)パターンを呼び出すDisposeの目的は?

public void Dispose() 
{ 
    Dispose(true); 

    // Use SupressFinalize in case a subclass 
    // of this type implements a finalizer. 
    GC.SuppressFinalize(this);  
} 

protected virtual void Dispose(bool disposing) 
{ 
    // If you need thread safety, use a lock around these 
    // operations, as well as in your methods that use the resource. 
    if (!_disposed) 
    { 
     if (disposing) { 
      if (_resource != null) 
       _resource.Dispose(); 
       Console.WriteLine("Object disposed."); 
     } 

     // Indicate that the instance has been disposed. 
     _resource = null; 
     _disposed = true; 
    } 
} 

答えて

14

ファイナライザはDispose(false)呼ぶだろう - あなたは(すでにファイナライズされている場合があります)他の管理対象リソースのいずれかには触れていない。その場合には。

個人的に私は頻繁にこのパターンに従いません - 私は非常にまれにしかファイナライザが必要ではないので、封印されていないIDisposable実装を書くこともまれです。ファイナライザなしで密封されたクラスを作成しているなら、私は単純な実装に行きます。

+1

あなたはまだ、このパターンに従ってくださいしかし、サブクラスは適切に(そして一貫して)扱うことができます。 –

+0

ファイナライザが不要な場合でも。 –

+0

@Reed:サブクラスが関わっているときにこれを行う唯一の理由は、ファイナライザを持つことができるからです。そうでなければ常に真実になるパラメータを気にするのはなぜですか? –

3

これはファイナライザがプロパティを処理できるようにするためであり、クラスから派生したサブクラスが適切に処理できるようにするためです。

詳細情報が必要な場合は5 part blog series on IDisposableと書いてあり、サブクラス化の問題についてはSubclass from an IDisposable Class articleで詳しく説明しています。

0

リソースがGCによってすでに解放されている可能性があるため、Dispose(disposing)メソッドはファイナライザからリソースが明示的に解放されるべきではありません。

したがって、Dispose(disposing)は、手動で呼び出されたのか、GCから呼び出されたのかを確認し、適切に動作する必要があります。

答えについて
0

あなたの処分(廃棄)メソッドこれらのリソースはすでにGCによって解放することができますので、それは、ファイナライザから呼び出された場合にすべきではない、明示的にリソースを解放。

重要な単語がありません。これは本当に言う必要があります。これらのリソースは、すでにGCによって解放することができますので、それは、ファイナライザから呼び出された場合

あなたの処分(廃棄)メソッドファイナライズべきで明示的に自由ではないが、リソースを(すなわち、管理しました)。ファイナライザではネイティブリソースのみをリリースする必要があります。

私はポスターはこのことを意味しますが、単にポストに十分な明示的ではなかったことをかなり確信している:あなたは非密閉さにIDisposableをリソースをカプセル化している場合)

関連する問題