.Net析构函数再论(源码剖析)

💡 原文中文,约5300字,阅读约需13分钟。
📝

内容提要

本文介绍了析构函数的标记、Dispose的混用、GC.SuppressFinalize的作用及标记的作用。BIT_SBLK_FINALIZER_RUN标记是最重要的,表示从析构队列里溢出,不需要运行当前类的析构函数。同时提到了技术问题需要解决。

🎯

关键要点

  • 本文介绍析构函数的标记、Dispose的混用、GC.SuppressFinalize的作用及标记的作用。

  • 析构函数目前发现的总共有三个标记,BIT_SBLK_FINALIZER_RUN是最重要的,表示不需要运行当前类的析构函数。

  • Dispose方法与析构函数混用,Dispose方法调用GC.SuppressFinalize来避免析构函数的执行。

  • GC.SuppressFinalize判断当前类是否有析构函数,并设置MethodTable的m_dwFlags标记。

  • 对象分配时,如果类包含析构函数,则设置GC_ALLOC_FINALIZE标志,将对象放入析构队列。

  • BIT_SBLK_FINALIZER_RUN标记表示对象从析构队列溢出,不需要运行析构函数。

  • GC的标记阶段扫描析构队列,标记存活的对象,如果有BIT_SBLK_FINALIZER_RUN标志,则不运行析构函数。

➡️

继续阅读