C#中弱引用使用小結(jié)
弱引用(Weak Reference)是一種特殊的引用類型,它允許你引用一個(gè)對(duì)象,但不會(huì)阻止該對(duì)象被垃圾回收器(GC)回收。弱引用通常用于需要緩存或跟蹤對(duì)象,但又不希望因保留引用而導(dǎo)致內(nèi)存泄漏的場(chǎng)景。弱引用對(duì)小對(duì)象沒有意義,因?yàn)槿跻糜凶约旱拈_銷,這個(gè)開銷可能比小對(duì)象更大。
核心概念??
??與強(qiáng)引用的區(qū)別??:
??強(qiáng)引用??:普通對(duì)象引用(如 var obj = new MyClass())會(huì)阻止 GC 回收對(duì)象。
??弱引用??:不會(huì)阻止 GC 回收對(duì)象。當(dāng)對(duì)象只有弱引用時(shí),GC 可以隨時(shí)回收它。
??用途??:
緩存大型數(shù)據(jù)(如圖片、文件等),當(dāng)內(nèi)存不足時(shí)自動(dòng)釋放。
避免因長期持有對(duì)象引用而導(dǎo)致內(nèi)存泄漏。
監(jiān)聽事件或觀察對(duì)象生命周期,但不干預(yù)其回收。
使用:
1.基礎(chǔ)使用:
代碼:
public class WeakReferenceTest : MonoBehaviour
{
WeakReference weakRef;
// Start is called before the first frame update
void Start()
{
// 創(chuàng)建一個(gè)對(duì)象
var myObject = new TestWeakReferenceObj();
// 創(chuàng)建弱引用
weakRef = new WeakReference(myObject);
// 解除強(qiáng)引用,只保留弱引用
myObject = null;
// 通過弱引用訪問對(duì)象
if (weakRef.IsAlive)
{
var obj = weakRef.Target as TestWeakReferenceObj;
obj.DoSomething();
}
else
{
Debug.Log("對(duì)象已被回收");
}
}
// Update is called once per frame
void Update()
{
// 通過弱引用訪問對(duì)象
if (weakRef.IsAlive)
{
var obj = weakRef.Target as TestWeakReferenceObj;
obj.DoSomething();
}
else
{
Debug.Log("對(duì)象已被回收");
}
}
}
class TestWeakReferenceObj {
public void DoSomething()
{
Debug.Log("對(duì)象沒有被回收");
}
}結(jié)果:

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("對(duì)象已被回收");
}
}
// Update is called once per frame
void Update()
{
if (weakRefGeneric.TryGetTarget(out TestWeakReferenceObj obj))
{
obj.DoSomething();
}
else
{
Debug.Log("對(duì)象已被回收");
}
}
}
class TestWeakReferenceObj {
public void DoSomething()
{
Debug.Log("對(duì)象沒有被回收");
}
}結(jié)果:

適用場(chǎng)景:
??緩存??:緩存大型對(duì)象,但允許 GC 在需要時(shí)回收它們。
事件監(jiān)聽??:避免事件訂閱導(dǎo)致的內(nèi)存泄漏。
??對(duì)象生命周期跟蹤??:觀察對(duì)象是否存活,但不阻止其回收。
注:
性能??:頻繁檢查弱引用是否存在可能影響性能。
??不確定性??:對(duì)象可能在任何時(shí)候被回收,需始終檢查 IsAlive 或 TryGetTarget。
??短期弱引用(Short Weak Reference)??:默認(rèn)行為,GC 回收后弱引用自動(dòng)失效。
??長期弱引用(Long Weak Reference)??:通過 WeakReference 構(gòu)造函數(shù)指定 trackResurrection 為 true,可跟蹤對(duì)象在終結(jié)后的狀態(tài)(但極少使用)。
總結(jié):
弱引用是 C# 中管理內(nèi)存的一種高級(jí)機(jī)制,適用于需要靈活控制對(duì)象生命周期的場(chǎng)景。正確使用它可以優(yōu)化內(nèi)存使用,但需謹(jǐn)慎處理對(duì)象可能隨時(shí)被回收的情況。
到此這篇關(guān)于C#中弱引用使用小結(jié)的文章就介紹到這了,更多相關(guān)C# 弱引用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c# 通過wbemtest和WMI Code Cretor更加高效的訪問WMI
能找到這篇博客的,相信都是有操作WMI需求的了。本文將講述如何快速驗(yàn)證、并集成到C#來操作WMI。2021-05-05
Unity 實(shí)現(xiàn)鼠標(biāo)滑過UI時(shí)觸發(fā)動(dòng)畫的操作
這篇文章主要介紹了Unity 實(shí)現(xiàn)鼠標(biāo)滑過UI時(shí)觸發(fā)動(dòng)畫的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04
C#編程實(shí)現(xiàn)對(duì)象與JSON串互相轉(zhuǎn)換實(shí)例分析
這篇文章主要介紹了C#編程實(shí)現(xiàn)對(duì)象與JSON串互相轉(zhuǎn)換的方法,結(jié)合實(shí)例分析了在DoNet2.0與Donet3.5環(huán)境下實(shí)現(xiàn)對(duì)象與JSON轉(zhuǎn)換的相關(guān)技巧,需要的朋友可以參考下2015-11-11
c#中xml文檔注釋編譯dll引用到其它項(xiàng)目示例
這篇文章主要介紹了c#中xml文檔注釋編譯dll引用到其它項(xiàng)目示例,需要的朋友可以參考下2014-02-02
C# 特性AttributeUsage簡(jiǎn)介與使用教程
這篇文章主要介紹了C# 特性AttributeUsage簡(jiǎn)介與使用教程,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
詳解C#的設(shè)計(jì)模式編程之抽象工廠模式的應(yīng)用
這篇文章主要介紹了C#的設(shè)計(jì)模式編程之抽象工廠模式的應(yīng)用,注意區(qū)分一下簡(jiǎn)單工廠模式、工廠方法模式和抽象工廠模式概念之間的區(qū)別,需要的朋友可以參考下2016-02-02

