![](/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.