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