【问题标题】:Will Dictionary<TKey, TValue> use TKey.Equals and TKey.GetHashCode?Dictionary<TKey, TValue> 会使用 TKey.Equals 和 TKey.GetHashCode 吗?
【发布时间】:2012-08-21 22:48:34
【问题描述】:

我已经实现了一个字典如下:

Dictionary<ErrorHashKey, ErrorRow> dictionary;

我在ErrorHashKey 类中定义了Equals()GetHashCode()。我目前正在为该项目编写一些文档,并从IEqualityComparer Interface doc 看到:

字典需要一个相等的实现 判断键是否相等。您可以指定一个实现 IEqualityComparer 通用接口通过使用构造函数 接受比较器参数;如果您不指定实现, 默认的通用相等比较器 EqualityComparer.Default 是 用过的。如果类型 TKey 实现 System.IEquatable 泛型 接口,默认相等比较器使用该实现。

我没有做任何文档指定的事情(或者至少我认为我没有做)。我没有在构造函数参数中传递比较器,也没有创建EqualityComparer.Default 比较器。

System.IEquatable&lt;T&gt; generic interface 是否在每个创建的类中自动实现?我应该定义IEqualityComparer&lt;T&gt; 的实现吗?

【问题讨论】:

    标签: c#


    【解决方案1】:

    如果未实现 IEquatable&lt;T&gt;,默认比较器将调用 object.Equalsobject.GetHashCode(您的覆盖方法)。这记录在documentation for EqualityComparer&lt;T&gt;.Default。你不需要做任何额外的事情,不,IEquatable&lt;T&gt; 不会在你的类中自动实现。

    【讨论】:

      【解决方案2】:

      您问题中的答案 ID:

      如果不指定实现,则默认泛型相等 使用了比较器 EqualityComparer.Default

      如果您没有实现 IEquatable,则 EqualityComparer.Default 将使用 Equals 方法。

      Default 属性检查类型 T 是否实现 System.IEquatable 接口,如果是,则返回一个 使用该实现的 EqualityComparer。否则,它 返回一个使用覆盖的 EqualityComparer T 提供的 Object.Equals 和 Object.GetHashCode。

      来源:http://msdn.microsoft.com/en-us/library/ms224763(v=vs.110).aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-14
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        相关资源
        最近更新 更多