9

以下のコード スニペットでパラメーターの破棄が必要なのはなぜですか。

さらに、ファイナライザーで false を指定して dispose を呼び出すと、解放もクリーンアップも行われません。

では、dispose が呼び出されない場合はどうなるでしょうか。

dispose は常にファイナライザーの前に呼び出されませんか?

using System;
public class MyClass : IDisposable 
{ 
    private bool disposed = false;  
    protected virtual void Dispose(bool disposing) 
    {    
        if (!disposed)
        {
            **//Do we really need this condition?
            if (disposing)**
            { 
                // called via myClass.Dispose().    
                // OK to use any private object references
            }
            disposed = true; 
        } 
    }
    public void Dispose() 
        // Implement IDisposable     
    {
        Dispose(true);   
        GC.SuppressFinalize(this); 
    } 
    ~MyClass() // the finalizer
    {
        //why do we need to call with false?
        Dispose(false);    
    }
} 

言い換えれば、なぜですか?

using System;
public class MyClass : IDisposable 
{ 
    private bool disposed = false;  
    protected virtual void Dispose(bool suppressFinalize) 
    {    
        if (!disposed)
        {
            //Do we really need this condition?

                // called via myClass.Dispose().    
                // OK to use any private object references            
            disposed = true; 
        }
        if (!suppressFinalize)
        {
            GC.SuppressFinalize(this); 
        }
    }
    public void Dispose() 
        // Implement IDisposable     
    {
        Dispose(true);   

    } 
    ~MyClass() // the finalizer
    {
        //why do we need to call with false?
        Dispose(false);    
    }
} 

実際、ファイナライザーは本当に必要ですか? なぜこれではないのですか?

using System;
public class MyClass : IDisposable 
{     
    public void Dispose() 
        // Implement IDisposable     
    {
        //just do the cleanup and release resources
        GC.SuppressFinalize(this);
    } 

} 
4

1 に答える 1

10

さらに、ファイナライザーで false を指定して dispose を呼び出すと、解放もクリーンアップも行われません。

実際、その場合、他のクラスが独自のクリーンアップを処理し、直接管理されていないリソースのクリーンアップのみを行うと想定します。

では、dispose が呼び出されない場合はどうなるでしょうか。

次に、ファイナライザーが呼び出され、直接の管理されていないリソースをクリーンアップしますが、間接リソースについては心配しません。

dispose は常にファイナライザーの前に呼び出されませんか?

なんらかの理由で誰もそれを呼び出さない場合はそうではありません。

このパターンは、ファイナライザーを必要とする可能性のある他のクラスの基本クラスとして機能するクラスを説明しようとしているため、必要以上に複雑だと思います。クラスを封印すれば、あなたが期待するものを正確に実装することができます:)

また、Joe Duffy の「二度とファイナライザーを書かない」というブログ投稿とパターンの長い説明を読むこともできます。

于 2012-06-01T17:22:28.117 に答える