繁体   English   中英

static Object.Equals方法,GetHashCode的默认实现和Dictionary类

[英]static Object.Equals method, default implementation of GetHashCode and the Dictionary class

我只是想确认一下我对一些基本原理的理解。 希望你不要介意!

我理解静态等于方法

Object.Equals(objA, objB)

首先检查参考相等性。 如果不等于引用,则调用对象实例equals方法

objA.Equals(objB)

目前在我的equals覆盖中,我首先检查引用相等性,如果不等于引用,则检查所有成员以查看语义是否相同。 这是一个好方法吗? 如果是这样,那么静态版本似乎是多余的?

另外,对象的默认GetHashCode究竟是做什么的呢?

如果我将我的对象添加到下面是HashTable的字典并且不覆盖equals和GetHashCode,那么我想我应该做的是使它最佳排序因此更好的检索时间?

目前在我的equals覆盖中,我首先检查引用相等性,如果不等于引用,则检查所有成员以查看语义是否相同。 这是一个好方法吗? 如果是这样,那么静态版本似乎是多余的?

是的,进行快速参考等式检查是个好主意。 无法保证您的方法将通过静态Object.Equals方法调用 - 它可以直接调用。 例如, EqualityComparer<T>.Default (用于相等性检查的典型中间人)将在许多情况下(当类型未实现IEquatable<T> )直接调用此方法,而不首先执行引用相等性检查。

另外,对象的默认GetHashCode究竟是做什么的呢?

它转发到RuntimeHelpers.GetHashCode :一个神奇的,内部实现的CLR方法,它是一个兼容的GetHashCode实现,用于引用相等。 有关更多信息,请参阅Object.GetHashCode()的默认实现 每当你重写Equals时,你一定要覆盖它。

编辑:

如果我将我的对象添加到下面是HashTable的字典并且不覆盖equals和GetHashCode,那么我想我应该做的是使它最佳排序因此更好的检索时间?

如果你不重写,你将获得与(可能)一个平衡良好的表的引用相等。 如果你覆盖一个而不是另一个,或者以任何其他不合规的方式实现它们,你将获得一个破碎的哈希表。

顺便说一下, 散列与排序有很大不同。

有关更多信息,请参阅在C#中覆盖Equals方法时为什么重写GetHashCode很重要?

你的第一个问题已经回答,但我认为第二个问题没有得到完全回答。

如果要将对象用作哈希表或字典中的键,则实现GetHashCode非常重要。 它最大限度地减少了碰撞,因此加快了查找速度。 当两个或多个键具有相同的哈希码时会发生查找冲突,并且对于那些调用equals方法。 如果哈希码是唯一的,则equals将只调用一次,否则将为具有相同哈希码的每个键调用它,直到equals返回true。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM