C#中弱引用使用小結(jié)
弱引用(Weak Reference)是一種特殊的引用類型,它允許你引用一個對象,但不會阻止該對象被垃圾回收器(GC)回收。弱引用通常用于需要緩存或跟蹤對象,但又不希望因保留引用而導(dǎo)致內(nèi)存泄漏的場景。弱引用對小對象沒有意義,因為弱引用有自己的開銷,這個開銷可能比小對象更大。
核心概念??
??與強引用的區(qū)別??:
??強引用??:普通對象引用(如 var obj = new MyClass())會阻止 GC 回收對象。
??弱引用??:不會阻止 GC 回收對象。當(dāng)對象只有弱引用時,GC 可以隨時回收它。
??用途??:
緩存大型數(shù)據(jù)(如圖片、文件等),當(dāng)內(nèi)存不足時自動釋放。
避免因長期持有對象引用而導(dǎo)致內(nèi)存泄漏。
監(jiān)聽事件或觀察對象生命周期,但不干預(yù)其回收。
使用:
1.基礎(chǔ)使用:
代碼:
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("對象沒有被回收");
}
}結(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("對象已被回收");
}
}
// 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("對象沒有被回收");
}
}結(jié)果:

適用場景:
??緩存??:緩存大型對象,但允許 GC 在需要時回收它們。
事件監(jiān)聽??:避免事件訂閱導(dǎo)致的內(nèi)存泄漏。
??對象生命周期跟蹤??:觀察對象是否存活,但不阻止其回收。
注:
性能??:頻繁檢查弱引用是否存在可能影響性能。
??不確定性??:對象可能在任何時候被回收,需始終檢查 IsAlive 或 TryGetTarget。
??短期弱引用(Short Weak Reference)??:默認(rèn)行為,GC 回收后弱引用自動失效。
??長期弱引用(Long Weak Reference)??:通過 WeakReference 構(gòu)造函數(shù)指定 trackResurrection 為 true,可跟蹤對象在終結(jié)后的狀態(tài)(但極少使用)。
總結(jié):
弱引用是 C# 中管理內(nèi)存的一種高級機制,適用于需要靈活控制對象生命周期的場景。正確使用它可以優(yōu)化內(nèi)存使用,但需謹(jǐn)慎處理對象可能隨時被回收的情況。
到此這篇關(guān)于C#中弱引用使用小結(jié)的文章就介紹到這了,更多相關(guān)C# 弱引用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Winform學(xué)生信息管理系統(tǒng)登陸窗體設(shè)計(1)
這篇文章主要為大家詳細(xì)介紹了Winform學(xué)生信息管理系統(tǒng)登陸窗體設(shè)計思路,感興趣的小伙伴們可以參考一下2016-05-05
C#讀取xml節(jié)點數(shù)據(jù)方法小結(jié)
這篇文章主要介紹了C#讀取xml節(jié)點數(shù)據(jù)的方法,實例總結(jié)了C#針對XML文件節(jié)點操作的相關(guān)技巧,需要的朋友可以參考下2015-06-06
winform dateTime數(shù)據(jù)類型轉(zhuǎn)換方法
這篇文章主要介紹了winform dateTime數(shù)據(jù)類型轉(zhuǎn)換方法,需要的朋友可以參考下2017-02-02
C#實現(xiàn)簡易灰度圖和酷炫HeatMap熱力圖winform(附DEMO)
本文主要介紹了C#實現(xiàn)簡易灰度圖和酷炫HeatMap熱力圖winform(附DEMO),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12
C#中的靜態(tài)字段double.Epsilon實例詳解
double.Epsilon 是C#中的一個靜態(tài)字段,表示 double 數(shù)據(jù)類型的最小可表示的正數(shù)值,這篇文章主要介紹了C#中的靜態(tài)字段double.Epsilon的相關(guān)知識,需要的朋友可以參考下2024-01-01
C#byte數(shù)組與Image的相互轉(zhuǎn)換實例代碼
這篇文章主要介紹了C#byte數(shù)組與Image的相互轉(zhuǎn)換實例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04

