我已經閱讀了大量正確實施Equals()
和GetHashCode()
的文章。我有一些有很多成員變量的類,爲此我必須實現一個Equals()
方法。到現在爲止還挺好。但是,當實施GetHashCode()
時,我總是發現一個好的實現。據我所知,某些類別他們永遠不會用在字典或散列表中,我不想花時間編寫一個好的GetHashCode()
實現,所以我想出了以下虛擬「默認」實現:如果不需要GetHashCode()虛擬實現
public override int GetHashCode()
{
Debug.Fail("If you see this message, implement GetHashCode() properly");
// Always return the same value for all instances of this class. This ensures
// that two instances which are equal (in terms of their Equals() method)
// have the same hash code.
return 0;
}
我想問你的意見,如果這是一個可行的方法。
一方面,我不想花時間在執行GetHashCode()
時,我不必。另一方面,我希望我的代碼乾淨有效。上述實現確保具有相同Equals()
結果的兩個實例也具有相同的哈希碼。當然,如果它真的會被用作字典中的關鍵字,那麼性能會很糟糕。但是對於這種情況你會得到調試斷言。
上述方法有什麼缺點,我可能錯過了?
看看這個SO問題。我不會說這是重複的,但它是絕對相關的:http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode – Konamiman 2014-09-03 14:39:28
個人意見:調試和發佈版本之間的顯着差異(如崩潰與樣本成功)是不好的主意。 – 2014-09-03 14:39:31
@AlexeiLevenkov這段代碼在調試和發佈之間無顯着差異。如果'Debug.Fail'被執行並且被忽略,則沒有區別。另請參閱我對Jon Skeet的答案的評論。 – Tobias 2014-09-03 15:41:40