IDictionary实现和替换值的契约

本文关键字:替换 契约 实现 TKey TValue IDictionary | 更新日期: 2023-09-27 18:30:31

this[key] = newValue实现值替换时,我应该遵循IDictionary<TKey, TValue>接口是否有"合约"?举个例子:

IDictionary<MyKey, string> dict = CreateEmptyDict();
var k1 = new MyKey(123);
var k2 = new MyKey(123);  
dict.Add(k1, "foo");
dict[k2] = "bar";

k1 和 k2 是这样的 k1.Equals(k2) 并且它们具有相同的哈希代码,但它们是引用类型,因此ReferenceEquals(k1, k2) == false .

BCL Dictionary<TKey, TValue>将包含(k1, "bar") 。我的问题是:这是我真的应该遵循的任何IDictionary<TKey, TValue>实现的"合同",还是如果更容易在底层数据结构中这样做,我可以让我的实现包含(k2, "bar")

IDictionary<TKey,TValue>实现和替换值的契约

它至少在某种程度上是特定于实现的。例如,Dictionary<,> 允许您指定用于检查键相等性IEqualityComparer<T>,而SortedDictionary<,>根本不使用 EqualsGetHashCode - 而是使用 IComparer<T> 来检查键顺序

创建一个依赖于引用相等性的字典是完全合理的 - 但请确保您非常仔细地记录它。我要指出的是,您实际上不需要自己实现IDictionary<,>来做到这一点......您只需要使用Dictionary<,>和自定义相等比较器,该比较器使用引用相等和RuntimeHelpers.GetHashCode()来获取Object.GetHashCode()未被覆盖时将使用的哈希代码。

实现字典是非常非常奇怪的,这样您就可以多次添加与键完全相同的值 - 但如何判断键是否实际上相等是另一回事,IMO。