2014-07-13 116 views
2

这是一个非常基本的问题。我正在调试一些内存泄漏,并完全困惑。假设我有以下几点:.NET垃圾回收器

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

回答

1

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

+0

感谢您的提示!关于内部参考:) –

1

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

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

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

1

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

DataRepository不是。您重写了指向旧字典的对象引用。

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

没有人留下来引用旧的字典。