这是一个非常基本的问题。我正在调试一些内存泄漏并完全混淆。假设我有以下内容:
public class ObjectData : IDataObject
{
public int Id { get; set; }
public string Name { get; set; }
}
public class ObjectRepository<T> where T : IDataObject
{
private Dictionary<int, T> Objects;
public ObjectRepository()
{
Objects = new Dictionary<int, T>();
// load Data
}
public T GetDataObject(int id);
{
return Objects[id];
}
public Reset()
{
Objects = new Dictionary<int, T>();;
}
}
现在假设我有以下程序流程:
public Main()
{
var DataRepository = new ObjectRepository<ObjectData>();
// Constructor called and Data loaded
var myObject = DataRepository.GetDataObject(1);
DataRepository.Reset();
// Call manually the garbage collector or leave it
// Program flow continue after this
}
问题是,垃圾收集器是否会删除构造函数最初创建的集合?或者不会因为其中一个元素仍在程序流程中被引用(myObject
)?
答案 0 :(得分:1)
它将被收集(最终),因为没有更多的引用。在字典中获取对某些内容的引用并不会提供对字典本身的任何引用!除非该对象以某种方式在内部引用字典,即。
答案 1 :(得分:1)
致电Reset
后,您的初始dictionary
没有强烈的引用。因此,它将被选为垃圾收集。
或者它不会因为程序流(myObject)中仍然引用了其中一个元素?
字典引用哪些对象并不重要,重要的是谁引用字典。在这种情况下,没有人。在内容仍然存在的情况下收集字典是完全可能的。
答案 2 :(得分:1)
要回答这些问题,请问自己:谁在引用相关对象(在这种情况下是覆盖的字典)?
DataRepository
不是。你覆盖了指向旧字典的对象引用。
myObject
不是因为ObjectData
没有任何类型字典字段。它无法引用字典。
没有人可以参考旧词典。