85.弱引用的定义和作用
85.1 题目
C#中的弱引用是什么?它的作用是什么?
85.2 深入解析
弱引用是什么
C#中提供了弱引用类 WeakReference,它在 System 命名空间中。
作用
弱引用允许垃圾回收器回收被弱引用的对象。
这意味着,只要对象没有被强引用,即使对象有弱引用指向它,垃圾回收器仍然可以回收这个对象的内存。
弱引用通常用于缓存和避免内存泄漏的场景。
使用场景
我们可以在一些缓存系统中使用弱引用来管理一些不常用但可能会再次使用的对象。比如对一些不常用的美术资源进行弱引用。
示例代码
以下是一个使用弱引用的示例代码:
object obj = new object();
WeakReference<object> weakR = new WeakReference<object>(obj);
obj = null; // 去掉强引用后再回收
GC.Collect();
// 多数情况下 TryGetTarget 为 false;是否回收还受其它因素影响,仅作演示
if (weakR.TryGetTarget(out var alive))
{
// 对象仍存活
}
需要注意的事项
- 有效性检查:每次使用弱引用对象时,都应该检查它的有效性,是否已经被回收。
- 使用场景:弱引用适合用于缓存系统,管理一些不常用但可能会再次使用的对象,避免内存泄漏。
通过弱引用,可以在保证内存效率的同时,减少内存泄漏的风险。在实际应用中,根据具体场景合理使用弱引用是非常重要的。
85.3 答题示例
弱引用(
WeakReference)是 .NET 提供的一种引用类型,它 不会阻止垃圾回收 回收被引用对象。
作用:用于实现缓存或内存敏感的对象管理——在内存紧张时,GC 可以回收这些缓存对象,避免 OutOfMemory,同时常用时还能重建或重新加载。
使用范例:
// 创建一个对象并建立弱引用 var data = LoadHeavyResource(); var cacheRef = new WeakReference<MyResource>(data); // 丢弃强引用 data = null; // 后续尝试获取 if (cacheRef.TryGetTarget(out var cached)) { // 缓存仍在,可重用 Use(cached); } else { // 已被回收,重新加载 cached = LoadHeavyResource(); cacheRef.SetTarget(cached); }优点:在保证缓存命中率的同时,不因缓存积累导致内存泄漏;
注意:每次访问前都要调用
TryGetTarget检测对象是否仍在,否则会拿到 null。
85.4 关键词联想
- WeakReference
- 垃圾回收(GC)
- 缓存管理
- 内存敏感资源
- TryGetTarget / SetTarget
- 强引用 vs 弱引用
- 内存泄漏防护
- 资源重建策略
- 内存压力
- 缓存失效
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com