げんさん日記

プログラミングで気付いた事等を書きます。

全モデルのベースを作成する。(IDisposable)

2021年05月20日 15時00分10秒 | C#
メモリのリークを最小限にする為、デストラクタを正しく定義し、「BaseModel」を作成して行きます。

クラスの名前をBaseModelにしてIDisposableを継承します。

解放済みを確認するフラグを用意します。
public abstract class BaseModel : IDisposable
{
  protected bool IsDisposed { get; set; }
}

次にデストラクタを定義しDisposeをfaiseで呼び出します。
~BaseModel()
{
  this.Dispose(false);
}

PublicのDisposeを定義します。
public void Dispose()
{
  // DisposeをTrueで呼び出す。
  this.Dispose(true);
  // 自分を解放する。
  GC.SuppressFinalize(this);
}

管理外のオブジェクトを解放する為、ProtectedのDisposeを定義します。
protected virtual void Dispose(bool disposing = true)
{
  // 解放済みなら何もしない
  if (this.IsDisposed == true) return;

  // 管理外のオブジェクトを解放する。
  if (disposing == true)
  {
  }
  this.IsDisposed = true;
}

継承先のモデル例
public Class TestModel : BaseModel
{
  // Disposeをオーバーライド
  protected override void Dispose(bool disposing = true)
  {
   // 解放済みなら何もしない
   if (this.IsDisposed == true) return;

   // 管理外オブジェクトの解放
   if (disposing == true)
   {
    // 自クラスのオブジェクト&イベントの解放
   }

   // ベースの解放を呼び出す。
   base.Dispose(disposing);
  }
}