gpt4 book ai didi

c# - IDictionary 替换值的实现和契约

转载 作者:太空狗 更新时间:2023-10-30 01:02:11 26 4
gpt4 key购买 nike

接口(interface)有没有“契约”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") .我的问题是:对于 IDictionary<TKey, TValue> 的任何实现,这是我真的应该遵循的“契约(Contract)”吗?或者我可以让我的实现包含 (k2, "bar")如果在底层数据结构中这样做更容易?

最佳答案

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

创建一个完全引用相等性的字典是完全合理的——但是一定要非常仔细地记录下来。我会注意到你并不真的需要实现 IDictionary<,>你自己去做......你只需要使用Dictionary<,>和自定义相等比较器,它使用引用相等和 RuntimeHelpers.GetHashCode() 获取 Object.GetHashCode() 的哈希码如果它没有被覆盖,将会使用。

要实现一个字典,以便您可以多次添加完全相同的值作为键,这将是非常非常奇怪的 - 但是您如何判断键是否实际上相等是不同的重要的是,IMO。

关于c# - IDictionary<TKey, TValue> 替换值的实现和契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34785156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com