【发布时间】:2016-01-16 00:38: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.
}
【问题讨论】:
-
如果你这样做,你会拖垮整个过程,无法处理异常。为什么不改用
Debug.Fail语句? -
我不想处理异常。不调用 Dispose 应该是立即修复的大问题。
-
我很想将其关闭为基于意见:我预计在意外失败时终止时大约有 50/50 的拆分与对您的库的用户很好,即使他们未能正确使用 API .
-
我真的很想知道是否有任何我不知道的意见?
-
考虑 Debug.Assert 而不是异常。结合一些强制 GC 的方法,它将为您提供相对可靠的方法来在调试时触发问题并在发布版本中保持良好的行为。
标签: c# .net dispose idisposable