簡體   English   中英

如果不需要 GetHashCode() 虛擬實現

[英]GetHashCode() dummy implementation if not needed

我已經閱讀了大量關於正確實現Equals()GetHashCode() 我有一些類有很多成員變量,我必須為它們實現Equals()方法。 到現在為止還挺好。 然而,在實現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()結果的兩個實例也具有相同的哈希碼。 當然,如果真的要作為字典的key,性能會很差。 但是對於這種情況,您將獲得調試斷言。

上述方法是否有任何我可能錯過的缺點?

如果您真的不想實現它,我建議您改為NotImplementedException異常(例如NotImplementedException ) - 那么您不僅僅依賴於Debug.Fail工作。 如果您最終在生產環境中遇到這種情況,那么快速失敗可能是最好的選擇。

但老實說,一旦你實現了相等,通常很容易編寫GetHashCode可能是這樣的代碼) - 如果這容易,那么這通常表明你的Equals方法無論如何都會違反其契約。

請注意, GetHashCode不僅僅用於字典 - 如果您嘗試根據您的類型鍵在 LINQ 中連接兩個列表,則將使用GetHashCode 基本上,不執行它違反了最小驚訝原則。 除非您是唯一使用您的代碼的人(並且您有完美的記憶力或願意在每次使用該類型時進行檢查),否則您應該正確實現它,IMO。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM