下面的一次性模式呢?
using System;
public class MyClass : IDisposable
{
public void Dispose()
// Implement IDisposable
{
//just do the cleanup
GC.SuppressFinalize(this);
}
}
更新
我的意思是,如果没有非托管资源,我还需要终结器吗?上面的一次性图案还不够好吗?是的,即使用户/开发人员不调用 dispose,默认情况下 GC 不调用 dispose 吗?
那么 GC 调用处置器和终结器的顺序又如何呢?
请参阅this question了解更多详情。
换句话说,当我们有终结器时,为什么我们调用 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 建议在终结器中释放 native 资源以及所有资源与处置()。如果显式调用 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);
}
}
最佳答案
因为您可能直接引用了非托管资源(例如 Windows 句柄),并且即使没有人调用 Dispose
,您也想释放它们。
虽然这种情况非常罕见 - 通常您只有真正通过其他托管类型间接引用非托管资源,这些托管类型在需要时将具有终结器。
关于c# - 如果我的类实现了 IDisposable,为什么还需要终结器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10854801/