在终结器中抛出异常以强制执行 Dispose 调用:

2024-04-10

这是我认为推荐的典型 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(使用前将#替换为@)

在终结器中抛出异常以强制执行 Dispose 调用: 的相关文章

随机推荐