C#中弱引用使用小結
弱引用(Weak Reference)是一種特殊的引用類型,它允許你引用一個對象,但不會阻止該對象被垃圾回收器(GC)回收。弱引用通常用于需要緩存或跟蹤對象,但又不希望因保留引用而導致內(nèi)存泄漏的場景。弱引用對小對象沒有意義,因為弱引用有自己的開銷,這個開銷可能比小對象更大。
核心概念??
??與強引用的區(qū)別??:
??強引用??:普通對象引用(如 var obj = new MyClass())會阻止 GC 回收對象。
??弱引用??:不會阻止 GC 回收對象。當對象只有弱引用時,GC 可以隨時回收它。
??用途??:
緩存大型數(shù)據(jù)(如圖片、文件等),當內(nèi)存不足時自動釋放。
避免因長期持有對象引用而導致內(nèi)存泄漏。
監(jiān)聽事件或觀察對象生命周期,但不干預其回收。
使用:
1.基礎使用:
代碼:
public class WeakReferenceTest : MonoBehaviour
{
WeakReference weakRef;
// Start is called before the first frame update
void Start()
{
// 創(chuàng)建一個對象
var myObject = new TestWeakReferenceObj();
// 創(chuàng)建弱引用
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 在需要時回收它們。
事件監(jiān)聽??:避免事件訂閱導致的內(nèi)存泄漏。
??對象生命周期跟蹤??:觀察對象是否存活,但不阻止其回收。
注:
性能??:頻繁檢查弱引用是否存在可能影響性能。
??不確定性??:對象可能在任何時候被回收,需始終檢查 IsAlive 或 TryGetTarget。
??短期弱引用(Short Weak Reference)??:默認行為,GC 回收后弱引用自動失效。
??長期弱引用(Long Weak Reference)??:通過 WeakReference 構造函數(shù)指定 trackResurrection 為 true,可跟蹤對象在終結后的狀態(tài)(但極少使用)。
總結:
弱引用是 C# 中管理內(nèi)存的一種高級機制,適用于需要靈活控制對象生命周期的場景。正確使用它可以優(yōu)化內(nèi)存使用,但需謹慎處理對象可能隨時被回收的情況。
到此這篇關于C#中弱引用使用小結的文章就介紹到這了,更多相關C# 弱引用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
c# 通過wbemtest和WMI Code Cretor更加高效的訪問WMI
能找到這篇博客的,相信都是有操作WMI需求的了。本文將講述如何快速驗證、并集成到C#來操作WMI。2021-05-05
Unity 實現(xiàn)鼠標滑過UI時觸發(fā)動畫的操作
這篇文章主要介紹了Unity 實現(xiàn)鼠標滑過UI時觸發(fā)動畫的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
C#編程實現(xiàn)對象與JSON串互相轉(zhuǎn)換實例分析
這篇文章主要介紹了C#編程實現(xiàn)對象與JSON串互相轉(zhuǎn)換的方法,結合實例分析了在DoNet2.0與Donet3.5環(huán)境下實現(xiàn)對象與JSON轉(zhuǎn)換的相關技巧,需要的朋友可以參考下2015-11-11

