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")
?
它至少在某种程度上是特定于实现的。例如,Dictionary<,>
允许您指定用于检查键相等性IEqualityComparer<T>
,而SortedDictionary<,>
根本不使用 Equals
和 GetHashCode
- 而是使用 IComparer<T>
来检查键顺序。
创建一个仅依赖于引用相等性的字典是完全合理的 - 但请确保您非常仔细地记录它。我要指出的是,您实际上不需要自己实现IDictionary<,>
来做到这一点......您只需要使用Dictionary<,>
和自定义相等比较器,该比较器使用引用相等和RuntimeHelpers.GetHashCode()
来获取Object.GetHashCode()
未被覆盖时将使用的哈希代码。
实现字典是非常非常奇怪的,这样您就可以多次添加与键完全相同的值 - 但如何判断键是否实际上相等是另一回事,IMO。