IDictionary <tkey,tvalue =“”>替换值的实现和合同

时间:2016-01-14 08:52:06

标签: c# .net

是否有&#34;合同&#34;对于IDictionary<TKey, TValue>接口,我应该在使用this[key] = newValue实现值替换时遵循?一个例子:

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")。 我的问题是:这是一个&#34;合同&#34;我真的应该关注IDictionary<TKey, TValue>的任何实现,或者如果在底层数据结构中更容易实现,我可以让我的实现包含(k2, "bar")吗?

1 个答案:

答案 0 :(得分:5)

它的实现特定至少某些范围。例如,Dictionary<,>允许您指定用于检查密钥是否相等的IEqualityComparer<T>SortedDictionary<,>不使用EqualsGetHashCode所有 - 相反,它使用IComparer<T>来检查密钥排序

创建一个依赖引用相等的字典是完全合理的 - 但请确保您非常仔细地记录。我会注意到你并不需要自己实现IDictionary<,>来做到这一点......你只需要使用Dictionary<,>和使用引用相等的自定义相等比较器RuntimeHelpers.GetHashCode()获取Object.GetHashCode()在未被覆盖的情况下将使用的哈希码。

实现字典会非常非常奇怪,因此您可以多次添加确切的相同的值作为键 - 但是如何判断键实际上是否相等则是不同的问题,IMO。