以下是我认为推荐的典型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可能是一个bug.
有没有特别的理由不完全接受这一点而是这样做呢?
~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. }
Gabriel Boya.. 8
从.NET 2.0及更高版本开始,如果未覆盖默认策略,则终结器中抛出的未处理异常会导致进程终止.
根据我的理解,Finalizer不是应该抛出异常的预期位置.我认为Dispose()
,如果Finalizer正确执行,可能会因为意外原因(线程中止,......)而无法调用方法,从中可以进行干净恢复.
从.NET 2.0及更高版本开始,如果未覆盖默认策略,则终结器中抛出的未处理异常会导致进程终止.
根据我的理解,Finalizer不是应该抛出异常的预期位置.我认为Dispose()
,如果Finalizer正确执行,可能会因为意外原因(线程中止,......)而无法调用方法,从中可以进行干净恢复.