簡體   English   中英

垃圾收集弱引用與結構引用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM