0

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

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

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

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

4

2 回答 2

2

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

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

于 2012-10-04T10:22:40.737 回答
2

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

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

在您的示例中,UniqueName当您调用时,变量将始终返回相同的值GetHashCode,并且您创建的任何实例Object都不会在程序的生命周期内返回相同的哈希码。

于 2012-10-04T10:44:38.823 回答