簡體   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