垃圾收集弱引用与结构引用

时间:2019-06-02 09:01:31

标签: c# reference garbage-collection

我正在做一些练习题,其中之一如下:

  

您正在创建一个名为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会比结构更适合吗?

1 个答案:

答案 0 :(得分:1)

要使GC能够收集对象,必须使用WeakReference,因为它没有对对象的强引用。 参见:https://docs.microsoft.com/de-de/dotnet/api/system.weakreference

在您的情况下,该结构将放置在堆上,因为您将其存储在显然存储在堆中的Dictionary中。因此,将创建一个强引用,并且只有从字典中删除该结构后,该结构才会被收集。

当您想缓存大对象时,通常会使用WeakReference,但您并不需要一直访问它们。因此,当您的程序需要在其他地方存储时,WeakReference允许GC收集对象。