4

MSDNのコードサンプルを参照してください:(http://msdn.microsoft.com/en-us/library/b1yfkh5e (v=VS.100).aspx )

// Design pattern for a base class.
public class Base: IDisposable
{
  private bool disposed = false;

  //Implement IDisposable.
  public void Dispose()
  {
      Dispose(true);
      GC.SuppressFinalize(this);
  }

  protected virtual void Dispose(bool disposing)
  {
      if (!disposed)
      {
          if (disposing)
          {
              // Free other state (managed objects).
          }
          // Free your own state (unmanaged objects).
          // Set large fields to null.
          disposed = true;
      }
  }

  // Use C# destructor syntax for finalization code.
  ~Base()
  {
      // Simply call Dispose(false).
      Dispose (false);
  }
}

Dispose()実装では、GC.SupressFinalize();を呼び出しますが、オブジェクトをファイナライズするためのデストラクタを提供します。

GC.SuppressFinalize()が呼び出されたときに、デストラクタに実装を提供する意味は何ですか?

意図が何であるか少し混乱していますか?

4

2 に答える 2

6

誰かがDisposeを呼び出すのを忘れた場合、ファイナライザーは(最終的に)最終クリーンアップを実行するために実行されます。ファイナライズはパフォーマンスを損なうため、理想的には誰も廃棄することを忘れません。using構文はそれを少し助けます。

于 2010-11-16T11:49:05.363 に答える
6

2つのシナリオがあります。

  • コードでDispose(推奨)を呼び出すと、ファイナライザーがキャンセルされ、オーバーヘッドがなくなります。
  • コードがオブジェクトを「リーク」し、GCがファイナライザーを呼び出します。
于 2010-11-16T11:50:03.177 に答える