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

 顏颖季珮琦 发布于 2023-02-13 10:17

以下是我认为推荐的典型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正确执行,可能会因为意外原因(线程中止,......)而无法调用方法,从中可以进行干净恢复.

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

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

    2023-02-13 10:18 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有