代码之家  ›  专栏  ›  技术社区  ›  Jules

在.Net中完成的成本

  •  5
  • Jules  · 技术社区  · 14 年前

    (1) 我读过很多关于IDisposable的问题,其中的答案建议不要使用Finalize,除非你真的需要使用Finalize,因为这涉及到处理时间。
    我没看到的是这个费用是多少,多久付一次。每毫秒?第二个?时间、日期等。

    (2) 而且,在我看来,Finalize在不总是知道是否可以处理对象时非常方便。例如,framework字体类。控件无法处理它,因为它不知道字体是否共享。字体通常是在设计时创建的,因此用户不知道如何处理它,因此finalize将在没有引用的情况下启动以最终删除它。这是正确的印象吗?

    5 回复  |  直到 14 年前
        1
  •  7
  •   TomTom    14 年前

    finalize的主要问题是它阻止对象被垃圾收集。相反,将调用终结器,并在“下次运行时”收集对象。从技术上讲,IIRC终结器在一个单独的线程中运行一个对象列表。无论如何,这不是一个“每个ms”的问题,更多的是一个“多GC运行需要摆脱的对象。

        2
  •  4
  •   Dave    8 年前

    Finalize在概念上与Dispose不同。完成can 只有

    How to Implement IDisposable and Finalizers: 3 Easy Rules .

        3
  •  1
  •   Adam Houldsworth    14 年前
        4
  •  1
  •   Brian Gideon    14 年前

    我来回答你的第二个问题。

    Finalize 不应以这种方式使用。事实上,除了极少数的边缘案件,你应该只覆盖 定稿 直接地

    IDisposable 类负责其生存期和何时调用的决定 Dispose . 代码的其他部分可以自由使用该类,但由于它们不能声明所有权,因此不应参与该类的生存期管理。

    不幸的是我不太熟悉 Font

        5
  •  0
  •   Spence    14 年前

    Finalize作为双重检查非常有用。如果崩溃或某人的错误代码在对象超出范围之前没有处理它,请确保它的资源将在终结器中释放。

    GC.SuppressFinalize(this) 这将允许您编写一个在这两种情况下都能工作的方法,并保证代码能够很好地工作。

    推荐文章