. net垃圾收集器

本文关键字:收集器 net | 更新日期: 2023-09-27 18:12:37

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

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)中被引用?

. net垃圾收集器

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

要回答这些问题,请问自己:谁在引用有问题的对象(在本例中是覆盖的字典)?

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

myObject不存在,因为ObjectData没有字典类型的字段。它不能引用字典

没有人可以参考旧字典

调用Reset之后,没有对初始dictionary的强引用。因此,它将被选为垃圾收集。

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

字典指向哪个对象并不重要,重要的是谁指向字典。在这种情况下,没有人。在字典的内容还活着的时候收集字典是完全有可能的。