C#.Net里面的析构函数为什么不会被执行?
💡
原文中文,约1400字,阅读约需4分钟。
📝
内容提要
本文讨论了代码中析构函数不被执行的原因及如何完全不执行析构函数。示例中的对象不符合条件,因此析构函数不会被执行。文章提供了相关参考。
🎯
关键要点
- 析构函数在代码中通常不会被执行,原因需要深入理解。
- 示例代码中,Program类的析构函数不会被执行,因为对象pm是局部引用对象,符合存活标记条件。
- 析构函数执行的先决条件包括对象需在GC阶段不被标记存活,并且在GC堆外。
- 即使将pm设置为null或调用两次GC.Collect(),析构函数仍然不会被执行。
- 可以通过调用GC.SuppressFinalize(obj)来完全不执行析构函数,该方法通知CLR不执行指定对象的析构函数。
- SuppressFinalize的先决条件包括判断对象是否包含析构函数,并设置对象头的标记位。
- 在GC扫描析构对象列表时,如果对象不存活,则会将其移动到析构空闲列表,避免执行析构函数。
➡️