为什么字典键是不可变的?

Vai*_*hav 1 c# dictionary key immutability

有一个问题,为什么他们要求使用不可变对象作为字典中的键.

当我最近使用字典(显然不是为了哈希表的目的)将Xml节点对象作为键放置时,问题实际上在我脑海中浮现.然后我在使用期间多次更新节点.

那么'使用不可变密钥'究竟意味着什么呢?

Jon*_*eet 12

将密钥插入哈希表时,哈希表会向密钥询问其哈希码,并将其与密钥本身及相关值一起记住.当您稍后执行查找时,哈希表会询问您要查找其哈希码的密钥,并且可以非常快速地找到表中具有相同哈希码的所有密钥.

只要哈希表中的键在其整个生命周期中保持相同的哈希码,这一切都很好 - 但如果它们是可变的(并且在插入哈希表后进行了变异),那么哈希码通常会改变,此时搜索时永远不会找到该条目.

当然,这仅适用于影响平等的突变.例如,如果您Person对具有名称和生日的实体进行哈希处理,但由于某种原因,仅将该名称用于相等性(因此在计算哈希代码时仅使用该名称),那么您可以将Person哈希表中的a 插入关键,改变它的生日,并且仍然可以在以后再次查找它没有任何问题.

  • 值得注意的是,由于`XMLNode`(问题中的情况)不会覆盖`Equals`或`GetHashCode`,因此它的相等概念基于身份,而身份本质上是不可变的.虽然这些对象作为键很少有用,但它们在确实有用的情况下是安全的键. (2认同)