.net 为什么不使用finalize进行清理。网

.net 为什么不使用finalize进行清理。网,.net,finalize,.net,Finalize,(Windows API创建的对象、文件、数据库连接对象、COM对象等)不在.NET Framework的范围内。我们必须明确清理我们的资源。对于这些类型的对象,.NET Framework提供了Object.Finalize方法,可以覆盖该方法并清理非托管资源的代码 为什么不使用finalize进行清理 什么是适合使用的 首选的方法是将IDisposable与一起实现。终结器是有时间限制的,如果终结器阻塞时间过长,GC将终止终结器-这是在可能的情况下避免终结器的主要原因 Dispose只是一个

(Windows API创建的对象、文件、数据库连接对象、COM对象等)不在.NET Framework的范围内。我们必须明确清理我们的资源。对于这些类型的对象,.NET Framework提供了Object.Finalize方法,可以覆盖该方法并清理非托管资源的代码

  • 为什么不使用finalize进行清理

  • 什么是适合使用的


  • 首选的方法是将
    IDisposable
    与一起实现。终结器是有时间限制的,如果终结器阻塞时间过长,GC将终止终结器-这是在可能的情况下避免终结器的主要原因

    Dispose
    只是一个方法调用,没有时间限制。dispose模式可选地提供终结器,用于调用方忘记调用
    dispose
    (因为它没有强制)作为释放资源的最后一次尝试的情况。如果调用了dispose,该模式还将抑制终结器

    我遇到的唯一需要终结器的有效用途是我为第三方应用程序编写的一系列插件,这些插件没有引发相关事件以正确管理对象生命周期。我使用终结器来确保我至少尝试过清理东西。除此之外,我从未直接依赖它

    IDisposable
    在C#中使用了
    关键字。因此,可以使用实现此接口的任何内容:

    using (var myDisposableItem = new MyDisposableItem())
    {
    } // Dispose will be called here for you.
    
    因此,从呼叫的角度来看,这是非常简单的


    在.NET Framework中,有各种类型实现了
    IDisposable
    ,但没有任何可处理的内容。我总是建议他们表现得像需要直接处理一样,因为公共合同规定他们有东西要处理,即使实施没有。不要编程到实现细节。

    Thx获得非常好的答案。我在想,C++与RAIDIAN之间的区别是什么?@ RAMIZHASSAN RAII作为一个概念,与“代码> IDISPOSTABLE < /C>”不可比,但如果使用“<代码>语句”,则在“<代码> >内,如果发生异常,将回答什么问题?”将调用
    Dispose
    方法,因为编译器会为其生成一个
    try finally
    。C#using语句的要点是在IDisposable代码周围有一个很好的try finally块。把这两件事放在一起,我们得到了RAII??你的最后一句话(“不要编程到实现细节”)与.NET中所有不需要IDisposable的类相比,不会计算,因为派生类型以后可能需要它,以及由IDisposable对象继承而父对象不可IDisposable的所有类。IDisposable接口是一个实现细节。您需要使用(existingobjectasidisposable){…}
    调用
    ,以捕获派生实现可IDisposable的所有情况,但文档(和实现)除外我想说的是,如果派生类依赖于在基类上下文中调用dispose,则表示公共契约已被破坏。