c# weakreference 弱引用有什么用
发布时间 - 2026-01-22 00:00:00 点击率:次WeakReference的核心用途是在不阻止GC回收的前提下临时持有对象,适用于大对象缓存、事件监听器防泄漏和打破循环引用;必须用TryGetTarget安全访问Target,避免NullReferenceException。
WeakReference 的核心用途是:在不阻止 GC 回收的前提下,临时“惦记着”一个对象——它不是为了长期持有,而是为了“有就用,没了再建”。
WeakReference 最典型的使用场景
它不是万能胶,而是专治几类特定问题的“止痛贴”:
-
大对象缓存:比如一个 50MB 的图像预处理结果、一棵深层嵌套的树视图数据。用户切走页面后,你不想强留它占内存,但返回时又希望“如果还在,就直接用”,
WeakReference正好卡在这个平衡点。 -
事件监听器防泄漏:UI 控件订阅了 ViewModel 的事件,但 ViewModel 生命周期更长。若不手动
Unsubscribe,控件就永远被强引用链拴住——改用弱引用管理订阅者(需配合自定义事件代理),可让控件随 UI 一起被回收。 -
避免循环引用导致的内存滞留:父对象持子对象强引用没问题,但子对象反过来强引用父对象,就容易形成 GC 不动的“孤岛”。把子→父的引用换成
WeakReference,就能打破僵局。
WeakReference 的两个构造函数参数差异很关键
别只用无参构造!trackResurrection 这个布尔值决定的是“对象被终结器复活后,弱引用还作不作数”:
-
new WeakReference(obj)→ 短弱引用(GCHandleType.Weak):终结器执行前就清空Target。对象一旦进 finalization 队列,你就再也拿不到它了。 -
new WeakReference(obj, true)→ 长弱引用(GCHandleType.WeakTrackResurrection):即使对象被GC.ReRegisterForFinalize(this)复活,Target仍可能非 null(但极罕见,且不可靠)。
绝大多数业务场景选默认(false)就够了;除非你在写底层框架、对象池,且明确需要感知复活状态,否则加 true 只会增加不确定性。
访问 Target 前必须检查,否则必崩
这是新手踩坑最密集的地方:弱引用不是“延迟加载”,而是“随时可能消失”。下面这段代码看着合理,实则危险:
var weak = new WeakReference(myBigObject); // ... 一段时间后 var obj = weak.Target as MyType; // ❌ Target 可能已是 null! obj.DoSomething(); // NullReferenceException!
正确姿势永远是:
if (weak.TryGetTarget(out MyType obj))
{
obj.DoSomething(); // ✅ 安全
}
else
{
// 重建或跳过
}
注意:IsAlive 属性已过时(.NET 5+ 标记为 obsolete),它不能保证 Target 非 null —— 因为 GC 可能在 IsAlive == true 后瞬间回收对象,紧接着 Target 就变 null。所以务必用线程安全的 TryGetTarget。
真正难的不是写对那几行代码,而是想清楚:这个对象“值得弱引用吗?”——太小

int 包装、短字符串)不值得;重建成本太高(如需远程调用 DB 初始化)也不适合;只有“大 + 易重建 + 访问频次低”的对象,才配得上 WeakReference 这张牌。
# go
# c#
# 延迟加载
# .net
# NULL
# 构造函数
# 字符串
# int
# 循环
# 线程
# 对象
# 事件
# this
# ui
# 它不
# 的是
# 这是
# 看着
# 前提下
# 也不
# 是在
# 还在
# 就能
# 你在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用Livewire构建动态组件?(入门代码)
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
如何用PHP快速搭建CMS系统?
bootstrap日历插件datetimepicker使用方法
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
如何在IIS中新建站点并配置端口与物理路径?
如何为不同团队 ID 动态生成多个“认领值班”按钮
如何快速生成橙子建站落地页链接?
java ZXing生成二维码及条码实例分享
微信小程序 闭包写法详细介绍
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
佛山网站制作系统,佛山企业变更地址网上办理步骤?
北京网站制作公司哪家好一点,北京租房网站有哪些?
高端企业智能建站程序:SEO优化与响应式模板定制开发
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
使用Dockerfile构建java web环境
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
,在苏州找工作,上哪个网站比较好?
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
*服务器网站为何频现安全漏洞?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
如何制作一个表白网站视频,关于勇敢表白的小标题?
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
Laravel中的Facade(门面)到底是什么原理
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
进行网站优化必须要坚持的四大原则
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
JS碰撞运动实现方法详解
javascript读取文本节点方法小结
Laravel怎么使用artisan命令缓存配置和视图
Laravel如何使用Eloquent进行子查询
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
图册素材网站设计制作软件,图册的导出方式有几种?
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
android nfc常用标签读取总结
Laravel如何集成Inertia.js与Vue/React?(安装配置)
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
EditPlus中的正则表达式实战(6)
教你用AI润色文章,让你的文字表达更专业
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
网站建设整体流程解析,建站其实很容易!
网站制作软件免费下载安装,有哪些免费下载的软件网站?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
高防服务器:AI智能防御DDoS攻击与数据安全保障
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南

