繁体   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