.NET垃圾收集器

时间:2014-07-13 11:20:20

标签: c# .net garbage-collection

这是一个非常基本的问题。我正在调试一些内存泄漏并完全混淆。假设我有以下内容:

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)?

3 个答案:

答案 0 :(得分:1)

它将被收集(最终),因为没有更多的引用。在字典中获取对某些内容的引用并不会提供对字典本身的任何引用!除非该对象以某种方式在内部引用字典,即。

答案 1 :(得分:1)

致电Reset后,您的初始dictionary没有强烈的引用。因此,它将被选为垃圾收集。

  

或者它不会因为程序流(myObject)中仍然引用了其中一个元素?

字典引用哪些对象并不重要,重要的是谁引用字典。在这种情况下,没有人。在内容仍然存在的情况下收集字典是完全可能的。

答案 2 :(得分:1)

要回答这些问题,请问自己:谁在引用相关对象(在这种情况下是覆盖的字典)?

DataRepository不是。你覆盖了指向旧字典的对象引用。

myObject不是因为ObjectData没有任何类型字典字段。它无法引用字典。

没有人可以参考旧词典。