没有字段的对象:如何实现GetHashCode?

时间:2012-10-04 10:18:55

标签: c# hashcode

复杂结构中的对象具有属性Dictionary<Object, Object> Annotations,我可以在其中存储在某些处理阶段使用的元数据和自定义数据。我现在可以创建一个static readonly object UniqueName = new object()并将其用作字典中的键。我使用static readonly object,因为我确信它是独一无二的。没有其他人可以创建完全相同的对象实例。如果我使用了一个字符串作为键,其他人可能会意外地使用与键相同的字符串,这可能会导致问题。

但是,我从几个来源(包括here)了解到,默认GetHashCode实现基于对象在内存中的位置。当垃圾回收器移动对象时,这可能会发生变化,这会导致它返回的哈希值发生变化。发生这种情况时,字典将无法找到与密钥对象关联的值。

如何确保没有字段的对象在其生命周期内不会更改其哈希码?

天真的解决方案是创建一个Key对象,GetHashCode始终返回42。但是,这会严重影响字典的性能,因此不是解决方案。

2 个答案:

答案 0 :(得分:2)

  

实现可能会更改它返回的哈希

默认的哈希代码实现永远不会更改单个对象的值。它永远不会在该对象的生命周期内发生变化,因此可以安全地使用。我(很快)阅读了你指出的那些答案,但是他们没有谈到在单个对象的生命周期中改变的哈希码。

答案 1 :(得分:2)

GetHashCode的默认实现返回索引,而不是内存地址。此索引在对象的生命周期内是唯一的,因此即使您的对象在内存中移动,它也会在您调用GetHashCode

时返回相同的值

但是,一旦对象被垃圾收集,它对你之后创建的新对象有效,返回与垃圾收集之前的前一个对象相同的值。

在您的示例中,UniqueName变量在调用GetHashCode时将始终返回相同的值,并且您创建的Object的实例将不会返回相同的哈希代码你的计划。