以下の使い捨てパターンはどうですか?
using System;
public class MyClass : IDisposable
{
public void Dispose()
// Implement IDisposable
{
//just do the cleanup
GC.SuppressFinalize(this);
}
}
アップデート
つまり、管理されていないリソースがない場合、ファイナライザーが必要ですか? 上記の使い捨てパターンで十分ではないでしょうか。はい、ユーザー/開発者が dispose を呼び出さない場合でも、GC はデフォルトで dispose を呼び出しませんか?
また、GC が dispose と finalizer を呼び出す順序についてはどうでしょうか?
詳細については、この質問を参照してください。
つまり、ファイナライザーがあるのに、なぜDispose
false をパラメーターとして呼び出すのでしょうか?
http://msdn.microsoft.com/en-us/magazine/cc163392.aspx#S2から、マネージド参照ではなく、ファイナライザーからアンマネージド リソースを解放することが常に推奨されるようです。
Dispose メソッドからアンマネージ リソースを解放することを常にお勧めします。記事を読んでも全体の要点はわかりませんでした。
ただし、管理されていないリソースがない場合は、以下のパターンが機能するはずです。
msdn.microsoft.com/en-us/magazine/cc163392.aspx#S2、msdn.microsoft.com/en-us/library/fs2xkftw.aspx によると、ネイティブ リソースをファイナライザーで解放し、それらすべてを dispose( )。dispose() が明示的に呼び出された場合、ファイナライザーを抑制することができます。つまり、ネイティブ リソースがない場合、ファイナライザーは必要ありません。
using System;
public class MyClass : IDisposable
{
private bool disposed = false;
protected virtual void Dispose(bool suppressFinalize)
{
if (!disposed)
{
//Just do the cleanup
//and release resources
disposed = true;
}
if (!suppressFinalize)
{
GC.SuppressFinalize(this);
}
}
public void Dispose()
// Implement IDisposable
{
Dispose(true);
}
~MyClass() // the finalizer
{
Dispose(false);
}
}