复杂结构中的对象具有属性Dictionary<Object, Object> Annotations
,我可以在其中存储在某些处理阶段使用的元数据和自定义数据。我现在可以创建一个static readonly object UniqueName = new object()
并将其用作字典中的键。我使用static readonly object
,因为我确信它是独一无二的。没有其他人可以创建完全相同的对象实例。如果我使用了一个字符串作为键,其他人可能会意外地使用与键相同的字符串,这可能会导致问题。
但是,我从几个来源(包括here)了解到,默认GetHashCode
实现基于对象在内存中的位置。当垃圾回收器移动对象时,这可能会发生变化,这会导致它返回的哈希值发生变化。发生这种情况时,字典将无法找到与密钥对象关联的值。
如何确保没有字段的对象在其生命周期内不会更改其哈希码?
天真的解决方案是创建一个Key
对象,GetHashCode
始终返回42
。但是,这会严重影响字典的性能,因此不是解决方案。
答案 0 :(得分:2)
实现可能会更改它返回的哈希
默认的哈希代码实现永远不会更改单个对象的值。它永远不会在该对象的生命周期内发生变化,因此可以安全地使用。我(很快)阅读了你指出的那些答案,但是他们没有谈到在单个对象的生命周期中改变的哈希码。
答案 1 :(得分:2)
GetHashCode
的默认实现返回索引,而不是内存地址。此索引在对象的生命周期内是唯一的,因此即使您的对象在内存中移动,它也会在您调用GetHashCode
但是,一旦对象被垃圾收集,它对你之后创建的新对象有效,返回与垃圾收集之前的前一个对象相同的值。
在您的示例中,UniqueName
变量在调用GetHashCode
时将始终返回相同的值,并且您创建的Object
的实例将不会返回相同的哈希代码你的计划。