弱引用(weak reference)是一种特殊的引用类型,它允许你引用一个对象,但不会阻止该对象被垃圾回收器(gc)回收。弱引用通常用于需要缓存或跟踪对象,但又不希望因保留引用而导致内存泄漏的场景。弱引用对小对象没有意义,因为弱引用有自己的开销,这个开销可能比小对象更大。
核心概念
与强引用的区别:
强引用:普通对象引用(如 var obj = new myclass())会阻止 gc 回收对象。
弱引用:不会阻止 gc 回收对象。当对象只有弱引用时,gc 可以随时回收它。
用途:
缓存大型数据(如图片、文件等),当内存不足时自动释放。
避免因长期持有对象引用而导致内存泄漏。
监听事件或观察对象生命周期,但不干预其回收。
使用:
1.基础使用:
代码:
public class weakreferencetest : monobehaviour
{
weakreference weakref;
// start is called before the first frame update
void 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 frame
void 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 update
void start()
{
weakrefgeneric = new weakreference<testweakreferenceobj>(new testweakreferenceobj());
if (weakrefgeneric.trygettarget(out testweakreferenceobj obj))
{
obj.dosomething();
}
else
{
debug.log("对象已被回收");
}
}
// update is called once per frame
void 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#中弱引用使用小结的文章就介绍到这了,更多相关c# 弱引用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论