.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标志,则不运行析构函数。
➡️