. 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
)中被引用?
它将被收集(最终),因为不再有对它的引用。获取对字典中的某物的引用并不会给你任何对字典本身的引用!除非该对象以某种方式在内部引用字典,否则
要回答这些问题,请问自己:谁在引用有问题的对象(在本例中是覆盖的字典)?
DataRepository
不是。您覆盖了指向旧字典的对象引用。
myObject
不存在,因为ObjectData
没有字典类型的字段。它不能引用字典
没有人可以参考旧字典
调用Reset
之后,没有对初始dictionary
的强引用。因此,它将被选为垃圾收集。
或者它不会因为其中一个元素仍然在程序流(myObject)中被引用?
字典指向哪个对象并不重要,重要的是谁指向字典。在这种情况下,没有人。在字典的内容还活着的时候收集字典是完全有可能的。