【发布时间】:2018-10-01 20:21:19
【问题描述】:
看这篇文章:references updated on GC,似乎堆可以在垃圾收集上被压缩,这意味着引用会改变。
现在,如果我将一个对象作为键放入字典中(假设该对象没有实现 GetHashCode/Equals),那么该引用将用于确定它在其内部哈希表中的位置。随后在 GC 上,如果引用更改,并且我想查找对象,C# 将如何找到它?
【问题讨论】:
-
这最终涉及到运行时如何为引用类型生成一致的哈希码。见this。关键是哈希码不是字面意义上的地址,而是运行时内部同步块的一部分。
-
不考虑哈希表或任何东西,如果
T是一个引用类型,那么任何T类型的项目集合,包括List<T>,都将持有references i> 到它的每个项目。它的工作原理是实现细节。但可以肯定的是,如果垃圾收集器决定在某个时候压缩内存,在此过程中移动“堆”上的对象,它必须确保每个保留对这些对象的引用的人,包括List<>或Dictionary<,>,更新其引用(假设引用是某种类型的内存地址)。
标签: c# dictionary garbage-collection