class Program
{
//Dispose(bool disposing) 呼び出し回数チェック用
public static int i = 1;
public static void Main()
{
var ds = new DisposeSample();
WriteLine("new DisposeSample()");
WriteLine("Dispose()実行します。");
ds.Dispose();
WriteLine("Dispose()をもう一度実行します。");
ds.Dispose();
}
public class DisposeSample : IDisposable
{
// Dispose(bool disposing)を少なくとも1回呼び出したか
//重複での呼び出し防止
private bool disposedValue = false;
protected virtual void Dispose(bool disposing)
{
Console.WriteLine("Dispose呼び出し:"+ i++ +"回目"); ;
if (!disposedValue)
{
if (disposing)
{
// マネージ リソースを ここで解放
WriteLine("■マネージ リソースを ここで解放。");
}
// アンマネージリソース ここで解放する。
WriteLine("■アンマネージリソース ここで解放。");
disposedValue = true;
}
}
// ファイナライザ ( デストラクタ )
~DisposeSample()
{
//アンマネージ リソース を明示的に解放
//Dispose()を一度呼んでいれば
//マネージ リソース は解放済み のはず
Dispose(false);
}
// このコードは、破棄可能なパターンを正しく実装できるように追加されました。
public void Dispose()
{
//マネージ リソース を明示的に解放
//アンマネージも ついでに? 解放
Dispose(true);
//ファイナライザを抑止
GC.SuppressFinalize(this);
}
}
}