请解释 C# 中弱引用的定义,并深入阐述其底层实现机制是怎样的?
考察说明
考查对 C# 弱引用概念的理解及底层垃圾回收机制的认识。
回答思路
- 【回答框架 1】弱引用是允许对象被垃圾回收但仍可访问的引用,与强引用相对,不会阻止对象回收。在 C# 中通过 System.WeakReference 类实现。
- 【回答框架 2】底层原理基于引用类型分类:强引用保持对象存活;弱引用不增加对象的引用计数,当没有强引用时,对象被视为不可达,垃圾回收器可回收其内存。
- 【回答框架 3】实现细节:WeakReference 存储对象的句柄(类似 GCHandle),当对象被回收时,句柄指向的对象变为 null,可通过 Target 属性或 IsAlive 检查。
- 【回答框架 4】在 .NET 中,弱引用分为短弱引用和长弱引用(保留 Finalize 信息),长弱引用在对象终结后仍可访问,但需要小心使用。
- 【关键点 1】弱引用不阻止垃圾回收,用于缓存、事件处理器等场景以减少内存泄漏。
- 【关键点 2】System.WeakReference 的 Target 属性在对象被回收后返回 null。
- 【关键点 3】短弱引用不跟踪对象的终结,长弱引用在终结后仍可访问,但可能复活。
- 【关键点 4】使用弱引用时可能出现对象被回收后访问为 null 的情况,需检查 IsAlive 属性。
- 【易错点 1】混淆弱引用与强引用在内存管理中的角色,以为弱引用能防止内存泄漏。
- 【易错点 2】未检查 IsAlive 或 Target 为 null 就直接使用,导致空引用异常。
- 【易错点 3】误用长弱引用导致对象复活,增加内存压力或出现意外行为。