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

C#中的弱引用使用

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

核心概念​​

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

使用:

1.基础使用:

代码:

public class WeakReferenceTest : MonoBehaviour
{WeakReference weakRef;// Start is called before the first frame updatevoid Start(){// 创建一个对象var myObject = new TestWeakReferenceObj();// 创建弱引用weakRef = new WeakReference(myObject);// 解除强引用,只保留弱引用myObject = null;// 通过弱引用访问对象if (weakRef.IsAlive){var obj = weakRef.Target as TestWeakReferenceObj;obj.DoSomething();}else{Debug.Log("对象已被回收");}}// Update is called once per framevoid Update(){// 通过弱引用访问对象if (weakRef.IsAlive){var obj = weakRef.Target as TestWeakReferenceObj;obj.DoSomething();}else{Debug.Log("对象已被回收");}}
}class TestWeakReferenceObj { public void DoSomething(){Debug.Log("对象没有被回收");}
}

结果:

2.泛型使用:

代码:

public class WeakReferenceTest : MonoBehaviour
{WeakReference<TestWeakReferenceObj> weakRefGeneric;// Start is called before the first frame updatevoid Start(){weakRefGeneric = new WeakReference<TestWeakReferenceObj>(new TestWeakReferenceObj());if (weakRefGeneric.TryGetTarget(out TestWeakReferenceObj obj)){obj.DoSomething();}else{Debug.Log("对象已被回收");}}// Update is called once per framevoid Update(){if (weakRefGeneric.TryGetTarget(out TestWeakReferenceObj obj)){obj.DoSomething();}else{Debug.Log("对象已被回收");}}
}class TestWeakReferenceObj { public void DoSomething(){Debug.Log("对象没有被回收");}
}

结果:

适用场景:

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


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

总结:

弱引用是 C# 中管理内存的一种高级机制,适用于需要灵活控制对象生命周期的场景。正确使用它可以优化内存使用,但需谨慎处理对象可能随时被回收的情况。

参考书籍或链接:

《C#高级编程》第2版

相关文章:

  • 深入详解人工智能数学基础——微积分中拉格朗日乘数法在GAN训练中的应用
  • (23)VTK C++开发示例 --- 读取所有的PolyData类型示例
  • Apache NetBeans 25 发布
  • dl学习笔记(13):从强化学习到PPO
  • MySQL之视图
  • 基于Docker、Kubernetes和Jenkins的百节点部署架构图及信息流描述
  • 大数据模型现状分析
  • 小程序Npm package entry file not found?
  • 定制一款国密浏览器(12):分析SM2签名算法的实现
  • HTTP 协议深度解析:从基础到实战的完整指南
  • Qt动态库信号崩溃问题解决方案
  • 【实战】基于 Hugging Face 的 LLM 高效微调全解析
  • ASAM MDF 文件格式简介:测量数据的标准化存储
  • Goland终端PowerShell命令失效
  • 量子计算与GPU的异构加速:基于CUDA Quantum的混合编程实践
  • Android7 Input(五)InputDispatcher
  • Missashe考研日记-day27
  • 碰一碰发视频源码搭建全解析,支持OEM
  • 分类数据处理全解析:从独热编码到高维特征优化
  • 如何解决docker运行Java程序导出Excel中文报错的问题?
  • 美国政府将暂时恢复部分受影响留学生的合法身份,并将制订新标准
  • 乌称泽连斯基与特朗普进行简短会谈
  • 苏炳添任暨南大学体育学院院长
  • 好未来:2025财年收入增长51%,下个财年提高整体盈利能力是首要任务
  • 李家超称香港将部署为内地企业提供供应链服务,突破美国封锁
  • 百台新车首秀上海车展,跨国车企联手中国技术开启智能化下半场