讲师中心 微信公众号
AI工具推荐 视频效率加速

C# WeakReference是什么 - 创建对对象的弱引用,允许GC回收

夜丽大大_2116

夜丽大大_2116

发布时间:2026-01-04 11:45:27

|

697人浏览过

|

来源于php中文网

原创

WeakReference 是 C# 中不阻止 GC 回收对象的引用类型,适用于缓存、事件监听管理等场景;需通过 Target 或 TryGetTarget 检查有效性,推荐使用泛型 WeakReference。

c# weakreference是什么 - 创建对对象的弱引用,允许gc回收

WeakReference 是 C# 中一种特殊的引用类型,它不阻止垃圾回收器(GC)回收其所指向的对象。换句话说,只要没有强引用指向该对象,即使存在 WeakReference,GC 仍可在下一次回收周期中将其回收。

为什么需要 WeakReference?

常用于缓存、事件监听器管理、大对象临时持有等场景,避免因引用导致对象长期驻留内存,造成内存泄漏或资源浪费。

  • 比如缓存图像数据:用 WeakReference 持有,内存紧张时自动释放,下次需要时再重建
  • 比如 UI 控件订阅事件后忘记取消:用弱引用持有订阅者,避免控件已销毁但事件源仍强引用它

如何创建和使用 WeakReference

创建后需通过 Target 属性访问对象,并始终检查是否为 null(已被回收):

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载
var obj = new byte[1024 * 1024]; // 1MB 对象
WeakReference weakRef = new WeakReference(obj);
<p>obj = null; // 切断强引用
GC.Collect(); // 主动触发回收(仅调试用)</p><p>if (weakRef.Target is byte[] recovered)
{
Console.WriteLine("对象还在");
}
else
{
Console.WriteLine("对象已被回收");
}

WeakReference — 泛型版本更安全

推荐使用泛型版 WeakReference<t></t>,避免装箱/拆箱,类型安全,且提供 TryGetTarget(out T target) 方法,语义更清晰:

  • TryGetTarget 返回 bool 表示是否成功获取,同时输出目标对象
  • 无需类型转换,无运行时异常风险
  • 性能略优,尤其对值类型或频繁访问场景

注意点和常见误区

WeakReference 不是“延迟回收开关”,它不控制 GC 行为,只被动反映对象存活状态:

  • GC 是否回收取决于当前内存压力、代龄、根引用等,WeakReference 无法预测或干预
  • 不要在多线程中直接多次访问 Target,应先用 TryGetTarget 获取一次并缓存结果
  • 不能用于跨 AppDomain 或序列化场景(.NET Core/.NET 5+ 已无 AppDomain)

基本上就这些。WeakReference 本身不复杂,但容易忽略“对象随时可能消失”这一本质,正确使用的关键是:始终检查有效性、避免重复解引用、优先选泛型版本。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

391

2026.03.13

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4538

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

1269

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

423

2026.01.21

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

0

2026.11.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn