字典如何在GC后找到对象?

tom*_*dar 1 c# dictionary garbage-collection

看看这篇文章:在GC上更新的引用,似乎堆可以在垃圾收集上得到压缩,这意味着引用会改变.

现在,如果我将一个对象放在一个Dictionary中作为一个键(假设该对象没有实现GetHashCode/Equals),那么该引用将用于确定它在其内部哈希表中的位置.随后在GC上,如果引用发生了变化,我想查找对象C#将如何找到它?

Jon*_*eet 9

字典不使用对象在内存中的位置来进行簿记 - 它使用哈希码.当对象在内存中移动时,对象的哈希码不会改变,即使它没有覆盖GetHashCode().关于它如何工作的细节是非常多的实现细节,但你绝对可以依赖于GetHashCode()在压缩之前和之后返回相同的值(假设该方法没有以某种奇怪和可怕的方式被覆盖).

虽然实施细节可能会随着时间的推移而发生变化,但这篇博文有一个有趣的(和最近的)描述.基于在.NET Core CLR GitHub仓库中追逐代码,我认为在.NET Core(截至2018年4月)仍然有效 - 据我所知,是一个合理的起点.