c# - 如果我的类实现了 IEqualityComparer<T>,我是否应该实现非泛型 GetHashCode 和 Equals?

标签 c# .net clr

我应该实现非泛型 GetHashCodeEquals如果我的类(class)实现 IEqualityComparer<T>

更新: 我希望 MS 在引入 IEqualityComparer<T> 时更新了他们集合的实现。 .所以我认为 Dictionary如果我的类实现 IEqualityComparer<T>,任何其他集合类将在内部检查并且不使用通用方法 GetHashCodeEquals仅当未实现该接口(interface)时。如果没有集合支持,该接口(interface)的值(value)就很小。

更新 2: 我刚刚检查了 Dictionary.FindEntry(TKey key)使用 ILSpy。它使用 IEqualityComparer<TKey> (下面的变量 comparer)。事实上,我没有发现任何非通用 GetHashCode 的使用和 Equals完全发挥作用。

int num = this.comparer.GetHashCode(key) & 2147483647;
for (int i = this.buckets[num % this.buckets.Length]; i >= 0; i = this.entries[i].next)
{
    if (this.entries[i].hashCode == num
                && this.comparer.Equals(this.entries[i].key, key))
    {
        return i;
    }
}

所以看起来我的类只需要实现IEqualityComparer<T>Dictionary 一起正确使用.

我明白,为了以防万一,实现非通用函数不会有任何危害。

但如果它没有带来值(value),我们应该花时间吗?

我会让我的问题更具体:

我应该实现非泛型 GetHashCodeEquals如果我的类(class)实现 IEqualityComparer<T>和:

  1. 我不在我的代码中使用非泛型集合
  2. 第三方代码不调用GetHashCodeEquals我的代码的方法。

Microsoft 代码是否仍然需要非通用版本才能正常工作?

更新 3: 我想我明白了。我以为IEqualityComparer<T>将在我的类(class)内实现。在那种情况下,我们将在一个地方拥有通用和非通用版本的方法。 那不是怎么来的IEqualityComparer<T>应该使用。它应该作为单独的类实现并用作参数。

谢谢大家

最佳答案

这取决于。 IEqualityComparer<T>用于比较一个类型的两个实例 T - 通常由单独的比较器类实现。通常你不会在类类型 T 中实现它.它旨在提供一个替代比较,以便与支持他的类型一起使用。

如果您在类本身中实现它,您通常会实现 IEquatable<T> .

也就是说,覆盖 Object.Equals 通常很有用,这通常非常简单,因为您可以使用 IEquatable<T>.Equals实现方法Object.Equals .这使得实现起来“便宜”。作为Object.Equals可能会被使用,它将为平等提供一致的含义,因此实现它通常是一个好主意。

如果您的对象将用作散列中的键,例如 Dictionary<T,U>HashSet<T> , 那么你应该覆盖 GetHashCode .如果甚至有可能以这种方式使用它,覆盖此方法是有益的。通常,我发现覆盖 GetHashCode 很有用任何时候我实现相等性,以防万一我以后使用该类型作为键。

关于c# - 如果我的类实现了 IEqualityComparer<T>,我是否应该实现非泛型 GetHashCode 和 Equals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10963898/

相关文章:

.net - NHibernate 中没有 : CaSTLe. 代理的持久性。<EntityName>代理和懒惰的 ="true"?

c# - 区分x :Name and Name in Wpf application

c# - 如何在任何基于 COLOR 的语言汇编中找到给定类型的所有类型依赖项?

c# - 我应该如何序列化包含大量对象列表的对象?

sql - SQL Server 2005 中 VARBINARY 字段的大小

c# - 编写 Linq2Xml 查询时出现问题

javascript - 使用 moment.js 转换从 C# View 模型接收的 JavaScript 日期

c# - 无法在 RichTextBox 中处理 Ctrl + S

c# - 我可以防止类被非抽象对象继承吗?

c# - MS Access DB 在执行后不保存更改 (C#)