![](/img/trans.png)
[英]Overriding Equals and GetHashCode - default implementation in derived class
[英]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.