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