我应该实现非泛型 GetHashCode
和 Equals
如果我的类(class)实现 IEqualityComparer<T>
?
更新:
我希望 MS 在引入 IEqualityComparer<T>
时更新了他们集合的实现。 .所以我认为 Dictionary
如果我的类实现 IEqualityComparer<T>
,任何其他集合类将在内部检查并且不使用通用方法 GetHashCode
和 Equals
仅当未实现该接口(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),我们应该花时间吗?
我会让我的问题更具体:
我应该实现非泛型 GetHashCode
和 Equals
如果我的类(class)实现 IEqualityComparer<T>
和:
- 我不在我的代码中使用非泛型集合
- 第三方代码不调用
GetHashCode
和Equals
我的代码的方法。
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/