メモリのリークを最小限にする為、デストラクタを正しく定義し、「BaseModel」を作成して行きます。
クラスの名前をBaseModelにしてIDisposableを継承します。
解放済みを確認するフラグを用意します。
public abstract class BaseModel : IDisposable
{
protected bool IsDisposed { get; set; }
}
{
protected bool IsDisposed { get; set; }
}
次にデストラクタを定義しDisposeをfaiseで呼び出します。
~BaseModel()
{
this.Dispose(false);
}
{
this.Dispose(false);
}
PublicのDisposeを定義します。
public void Dispose()
{
// DisposeをTrueで呼び出す。
this.Dispose(true);
// 自分を解放する。
GC.SuppressFinalize(this);
}
{
// 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;
}
{
// 解放済みなら何もしない
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);
}
}
{
// Disposeをオーバーライド
protected override void Dispose(bool disposing = true)
{
// 解放済みなら何もしない
if (this.IsDisposed == true) return;
// 管理外オブジェクトの解放
if (disposing == true)
{
// 自クラスのオブジェクト&イベントの解放
}
// ベースの解放を呼び出す。
base.Dispose(disposing);
}
}