簡體   English   中英

我是否必須實現GetHashCode()才能遵循最佳實踐?

[英]Do I have to implement GetHashCode() to follow best practice?

在我的課堂上,我有以下覆蓋。

public override bool Equals(object input)
{
  Occasion comparee = input as Occasion;
  return comparee != null && comparee.Id == Id;
}

它已在GUI中用於確定combox的預選值,並且效果很好。 但是,R#提出了建議,如果我重寫了Equals(object) ,那么我也應該重寫GetHashCode() 當我添加以下代碼時,它表示該代碼正在調用基本方法。

public override int GetHashCode()
{
  return base.GetHashCode();
}

我必須返回一些東西,因此基本上它要我實現一個返回任意整數的虛擬方法(據我所知,它在代碼中的任何地方都沒有使用,因為無論是否注釋掉它,我都會得到相同的行為。

由於最佳實踐是忽略不需要的代碼,因此我對適當的設計感到困惑。

GetHashCodeMSDN頁面指出:

如果覆蓋GetHashCode方法,則還應該覆蓋Equals,反之亦然。 如果在測試兩個對象是否相等時重寫的Equals方法返回true,則重寫的GetHashCode方法必須為兩個對象返回相同的值。

如果要覆蓋等於,以便當對象ID相等時返回true,則必須定義GetHashCode方法,以在給定相同ID時返回相同的哈希碼。

哈希碼用於集合中的插入和查找-因此,您編寫的任何代碼都不太可能直接使用該哈希碼,但其他.NET代碼會使用該哈希碼。 但是,如果未正確實現它,則在處理對象集合時可能會發現性能問題或更糟。 例如,如果您弄錯了或未實現它,則可能無法確定類的實例是否在集合中,否則您將無法檢索放入的實例。

在您的情況下,方法很簡單:

public override int GetHashCode()
{
    return Id.GetHashCode();
}

因為您只是在Equals方法中比較ID。

暫無
暫無

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

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