我正在做一些练习题,其中之一如下:
您正在创建一个名为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
会比结构更适合吗?
答案 0 :(得分:1)
要使GC能够收集对象,必须使用WeakReference,因为它没有对对象的强引用。 参见:https://docs.microsoft.com/de-de/dotnet/api/system.weakreference
在您的情况下,该结构将放置在堆上,因为您将其存储在显然存储在堆中的Dictionary中。因此,将创建一个强引用,并且只有从字典中删除该结构后,该结构才会被收集。
当您想缓存大对象时,通常会使用WeakReference,但您并不需要一直访问它们。因此,当您的程序需要在其他地方存储时,WeakReference允许GC收集对象。