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