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

时间:2018-04-21 06:39:59

标签: c# dictionary garbage-collection

查看这篇文章:references updated on GC,似乎堆可以在垃圾收集上得到压缩,这意味着引用会发生变化。

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

1 个答案:

答案 0 :(得分:9)

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

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