【问题标题】:Garbage collecting a weak reference vs a struct reference垃圾收集弱引用与结构引用
【发布时间】:2019-06-02 09:01:31
【问题描述】:

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

您正在创建一个名为 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 AppDomain-wide static 对象
  • 为什么他们不能只问一个选择题来看看你是否知道WeakReference 是什么?这以更少的不确定性实现了相同的结果。我不喜欢在看起来没有经过深思熟虑的情况下回答问题,而且我意识到他们可能会根据他们没有考虑的因素对自己的问题做出错误的答案。或者所有的答案都是错误的,你必须猜测他们认为哪一个是正确的,以及为什么。真正分裂的头发,两个字典都没有实例化。
  • @ScottHannen,字典是static
  • @J.Doe,是的,但它们都是空的。我们可以理解其意图,但这让我想知道当他们(创建测试的人)编写问题时,他们在多大程度上考虑了细节。有很多迹象表明他们没有,这让我想知道他们确实想了什么。

标签: c# reference garbage-collection


【解决方案1】:

要让 GC 收集对象,您必须使用 Wea​​kReference,因为它不持有对您的对象的强引用。 见:https://docs.microsoft.com/de-de/dotnet/api/system.weakreference

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

当您想要缓存大型对象但不需要始终可以访问它们时,通常会使用 Wea​​kReference。所以当你的程序需要存储在别处时,WeakReference 允许 GC 收集对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2013-05-11
    相关资源
    最近更新 更多