当前位置: 首页 > 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.zskr.cn/news/1366801.html

相关文章:

  • 开源包管理器VPKEdit:20+游戏格式支持,MOD开发者的终极工具箱?
  • 融合多源数据与多任务学习:突破聚合物气体传输性能预测的数据瓶颈
  • 机器学习可靠性:不确定性量化与算法任意性解析
  • Windows触控板三指拖拽终极指南:告别鼠标,拥抱高效操作
  • Video2X:基于AI的视频超分辨率与帧率提升解决方案
  • 艾尔登法环存档救星:5分钟拯救数百小时游戏进度的终极指南
  • 利用C#实现Word信息自动化提取功能
  • AutoJs6安卓11外部存储权限终极解决方案:一键开启“所有文件访问“权限
  • SPT-AKI存档编辑器终极指南:掌握《逃离塔科夫》单机版修改技巧
  • 稳定的工作_or_冒险的挖洞副业?成年人的选择,从来不是非黑即白
  • Real-ESRGAN-GUI完全指南:让模糊图片秒变高清的免费AI神器
  • 10个核心概念,让你秒懂AI Agent到底是如何思考的!从Perceive到Act,揭秘Agent的“思考”机制!
  • 快速构建AI客服原型,利用Taotoken多模型能力进行效果调优
  • 3分钟快速指南:用KMS_VL_ALL_AIO智能脚本一键激活Windows和Office
  • 构建毫秒级离线词典服务的完整技术实践:ECDICT架构解析与性能优化
  • Taotoken 的 API Key 管理与审计日志功能在安全合规中的应用
  • DLSS Swapper完整指南:3步解锁游戏性能的隐藏潜力
  • AutoCut视频剪辑神器:像编辑Word一样剪视频,3步完成专业剪辑
  • 怎样轻松突破微信网页版限制:wechat-need-web开源插件实用指南
  • 如何永久保存微信聊天记录?这款开源工具让你轻松搞定!
  • HS2-HF Patch终极指南:一站式解决HoneySelect2汉化、去和谐与MOD管理难题
  • 深度解析:如何利用79万条中文医疗对话数据构建智能医疗问答系统
  • OneNote Markdown插件:如何提升技术文档编写效率的解决方案
  • 无敏感信息下的机器学习公平性:两大前沿框架与工程实践
  • KMS_VL_ALL_AIO:你的Windows激活烦恼终结者
  • 3步实现专业直播音质:OBS-VST插件完全指南
  • 游戏和编程两不误:用Unity做一个简单小游戏
  • SPT-AKI Profile Editor:逃离塔科夫离线版终极存档编辑器完全指南
  • LSLib:神界原罪与博德之门3游戏资源处理的终极指南
  • ZXPInstaller终极指南:免费开源工具轻松搞定Adobe插件安装