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

Kel*_*sie 6 .net c# dispose idisposable

以下是我认为推荐的典型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.
}
Run Code Online (Sandbox Code Playgroud)

现在,根据我的理解,终结器背后的想法是,如果我不调用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.
}
Run Code Online (Sandbox Code Playgroud)

Gab*_*oya 8

从.NET 2.0及更高版本开始,如果未覆盖默认策略,则终结器中抛出的未处理异常会导致进程终止.

根据我的理解,Finalizer不是应该抛出异常的预期位置.我认为Dispose(),如果Finalizer正确执行,可能会因为意外原因(线程中止,......)而无法调用方法,从中可以进行干净恢复.

  • 我当然不希望它继续工作而没有人意识到它已经坏了。 (2认同)