下面的一次性图案呢?
using System;
public class MyClass : IDisposable
{
public void Dispose()
// Implement IDisposable
{
//just do the cleanup
GC.SuppressFinalize(this);
}
}
更新
我的意思是说,如果没有非托管资源,我需要终结器吗?上面的一次性图案还不够好吗?是的,即使用户/开发人员不调用 dispose,GC 不默认调用 dispose 吗?
GC 调用 dispose 和 finalizers 的顺序又如何呢?
请参阅此问题以获取更多详细信息。
换句话说,当我们有终结器时,为什么我们要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);
}
}