[英]Garbage collecting a weak reference vs a struct reference
我正在做一些練習題,其中之一如下:
您正在創建一個名為Data的類,其中包含一個名為_data的字典對象。 您需要允許垃圾回收過程收集_data對象的引用。 您應該如何完成相關代碼?
public class Data
{
<replace1>
public Data(int count)
{
for (int i = 0; i < count; i++)
{
<replace2>
}
}
}
以下是選項:
static Dictionary<int, WeakReference> _data;
static Dictionary<int, Int32> _data;
_data.Add(i, new WeakReference(new Class(i*2), false));
_data.Add(i, (Int32)(i*2));
因為,基本上,問題是“如果希望垃圾收集器能夠收集對象,您應該使用WeakReference
還是結構引用?” 我認為Int32
結構會是一個更好的選擇,因為它在堆上沒有引用任何對象,因此即使沒有強引用,弱引用也無法使對象保持活動狀態(即使到目前為止,弱引用也無法使該對象保持活動狀態)(到目前為止)據我了解),我仍然認為該結構會是一個更好的答案, 但是實踐測試表明WeakReference
是正確的答案 。 請注意,即使對於最明顯和最簡單的問題,此練習測試也是錯誤的。
您能解釋一下為什么在這種情況下,如果我們希望GC能夠收集我們的對象,那么WeakReference
比結構更適合嗎?
為了使GC能夠收集對象,您必須使用WeakReference,因為它沒有對對象的強引用。 請參閱: https : //docs.microsoft.com/de-de/dotnet/api/system.weakreference
在您的情況下,該結構將被放置在堆上,因為您將其存儲在顯然存儲在堆中的Dictionary中。 因此,將創建一個強引用,並且只有從字典中刪除該結構后,該結構才會被收集。
當您要緩存大對象時,通常不需要使用WeakReference,而是不需要一直訪問它們。 因此,當您的程序需要在其他地方存儲時,WeakReference允許GC收集對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.