这是我认为推荐的典型 IDisposable 实现:
~SomeClass() {
Dispose(false);
}
public void Dispose() {
GC.SuppressFinalize(this);
Dispose(true);
}
protected virtual void Dispose(bool isDisposing) {
if(isDisposing) {
// Dispose managed resources that implement IDisposable.
}
// Release unmanaged resources.
}
现在,据我了解,终结器背后的想法是,如果我不调用 Dispose,我的非托管资源仍将被正确释放。然而,据我所知,人们普遍认为不对实现 IDisposable 的对象调用 Dispose 可能是一个错误。
是否有特殊原因不完全接受这一点而这样做?
~SomeClass() {
throw new NotImplementedException("Dispose should always be called on this object.");
}
public virtual void Dispose() {
GC.SuppressFinalize(this);
// Dispose managed resources that implement IDisposable.
// Release unmanaged resources.
}
从 .NET 2.0 及更高版本开始,终结器中抛出未处理的异常导致进程终止 http://msdn.microsoft.com/en-us/library/system.object.finalize%28v=VS.100%29.aspx如果默认策略未被覆盖。
据我了解,终结器不是预期位置应该抛出异常的地方。我认为有可能Dispose()
方法不会因意外原因(线程中止,...)而被调用,只要 Finalizer 正确执行,仍然可以从中进行干净的恢复。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)