当前位置: 首页 > news >正文

C#中弱引用使用小结

弱引用(Weak Reference)是一种特殊的引用类型,它允许你引用一个对象,但不会阻止该对象被垃圾回收器(GC)回收。弱引用通常用于需要缓存或跟踪对象,但又不希望因保留引用而导致内存泄漏的场景。弱引用对小对象没有意义,因为弱引用有自己的开销,这个开销可能比小对象更大。

核心概念​​

​​与强引用的区别​​
​​强引用​​:普通对象引用(如 var obj = new MyClass())会阻止 GC 回收对象。
​​弱引用​​:不会阻止 GC 回收对象。当对象只有弱引用时,GC 可以随时回收它。
​​用途​​
缓存大型数据(如图片、文件等),当内存不足时自动释放。
避免因长期持有对象引用而导致内存泄漏。
监听事件或观察对象生命周期,但不干预其回收。

使用:

1.基础使用:

代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

publicclassWeakReferenceTest : MonoBehaviour

{

WeakReference weakRef;

// Start is called before the first frame update

voidStart()

{

// 创建一个对象

var myObject =newTestWeakReferenceObj();

// 创建弱引用

weakRef =newWeakReference(myObject);

// 解除强引用,只保留弱引用

myObject =null;

// 通过弱引用访问对象

if(weakRef.IsAlive)

{

var obj = weakRef.TargetasTestWeakReferenceObj;

obj.DoSomething();

}

else

{

Debug.Log("对象已被回收");

}

}

// Update is called once per frame

voidUpdate()

{

// 通过弱引用访问对象

if(weakRef.IsAlive)

{

var obj = weakRef.TargetasTestWeakReferenceObj;

obj.DoSomething();

}

else

{

Debug.Log("对象已被回收");

}

}

}

classTestWeakReferenceObj {

publicvoidDoSomething()

{

Debug.Log("对象没有被回收");

}

}

结果:

2.泛型使用:

代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

publicclassWeakReferenceTest : MonoBehaviour

{

WeakReference<TestWeakReferenceObj> weakRefGeneric;

// Start is called before the first frame update

voidStart()

{

weakRefGeneric =newWeakReference<TestWeakReferenceObj>(newTestWeakReferenceObj());

if(weakRefGeneric.TryGetTarget(outTestWeakReferenceObj obj))

{

obj.DoSomething();

}

else

{

Debug.Log("对象已被回收");

}

}

// Update is called once per frame

voidUpdate()

{

if(weakRefGeneric.TryGetTarget(outTestWeakReferenceObj obj))

{

obj.DoSomething();

}

else

{

Debug.Log("对象已被回收");

}

}

}

classTestWeakReferenceObj {

publicvoidDoSomething()

{

Debug.Log("对象没有被回收");

}

}

结果:

适用场景:

​缓存​​:缓存大型对象,但允许 GC 在需要时回收它们。
事件监听​​:避免事件订阅导致的内存泄漏。
​​对象生命周期跟踪​​:观察对象是否存活,但不阻止其回收。


性能​​:频繁检查弱引用是否存在可能影响性能。
​​不确定性​​:对象可能在任何时候被回收,需始终检查 IsAlive 或 TryGetTarget。
​​短期弱引用(Short Weak Reference)​​:默认行为,GC 回收后弱引用自动失效。
​​长期弱引用(Long Weak Reference)​​:通过 WeakReference 构造函数指定 trackResurrection 为 true,可跟踪对象在终结后的状态(但极少使用)。


http://www.cnnetsun.cn/news/2541169.html

相关文章:

  • 如何快速构建本地英汉词典应用:ECDICT开源数据库完整指南
  • RAG是什么,为什么很多地方都看到RAG
  • AI写作辅助平台的合规秘籍:从文献整理到成稿的合规流程解析?
  • 打造专属AI工作空间:Chatbox主题个性化完全指南
  • 如何3分钟实现九大网盘下载加速:LinkSwift网盘直链解析工具终极指南
  • QuPath数字病理分析:3个关键优势让生物图像分析更简单高效
  • WarcraftHelper技术架构深度解析:Windows游戏兼容性解决方案实现
  • HS2-HF_Patch汉化补丁:5分钟解锁Honey Select 2完整中文体验
  • N_m3u8DL-RE流媒体下载器终极指南:跨平台高效下载与专业配置
  • Burp Suite安装配置手术级指南:Java环境、代理链路与证书信任全解析
  • ComfyUI-Impact-Pack终极指南:3种方法快速实现AI图像智能修复与细节增强
  • 告别混乱!一张图理清Ubuntu网络管理变迁:从interfaces到Netplan,再到NetworkManager全解析
  • kNN×KDE算法:基于概率分布的缺失值填补及其在天文数据中的应用
  • WebPlotDigitizer完全指南:从图表图像提取数据的3步终极解决方案
  • 构建毫秒级离线词典服务的完整技术实践:ECDICT架构解析与性能优化
  • 互联网大厂 Java 求职者面试:从音视频场景到数据处理
  • 告别U盘!用PXE+NFS给裸机批量装Ubuntu 22.04,5分钟搞定一台
  • 量子时间最优控制:基于几何与Cartan分解的常数θ法解析
  • 代码语言模型安全攻防:投毒、逃逸与隐私攻击深度解析
  • Node.js 概览:是什么、能做什么、从业价值与前景分析
  • 微信直连 OpenClaw,手机发指令操控电脑,效率炸裂
  • 重塑macOS应用管理:Applite如何让复杂操作变得优雅简单
  • DeepSeek V4-Pro永久降价与Composer 2.5发布:2026年5月编程AI工具格局重塑
  • 从能量关联函数到D2:喷注子结构分析与Sudakov安全观测量
  • 一键安装WinGet:PowerShell脚本助你快速部署Windows包管理器
  • PVZ Toolkit完整教程:5分钟掌握植物大战僵尸PC版最强修改器
  • Claude Code用户如何配置Taotoken解决密钥被封与Token不足痛点
  • 传感器内计算实战:基于ISM330AILP的极低功耗边缘AI部署与优化
  • 告别ClaudeCode封号烦恼用Taotoken稳定获取编程助手
  • Godot 4 C#调试失败原因与VS2022正确Attach方法