[英]C# User class. GetHashCode implementation
我只有公共字符串屬性的簡單類。
public class SimpleClass
{
public string Field1 {get; set;}
public string Field2 {get; set;}
public string Field3 {get; set;}
public List<SimpleClass> Children {get; set;}
public bool Equals(SimpleClass simple)
{
if (simple == null)
{
return false;
}
return IsFieldsAreEquals(simple) && IsChildrenAreEquals(simple);
}
public override int GetHashCode()
{
return RuntimeHelpers.GetHashCode(this); //Bad idea!
}
}
對於相等的實例,此代碼不會返回相同的值。 但是此類沒有用於計算哈希的只讀字段。
如果我所有的屬性都是可變的,我該如何在GetHashCode()
生成正確的哈希。
GetHashCode
的合同要求(強調我的):
只要沒有修改確定對象的Equals方法返回值的對象狀態,對象的
GetHashCode
方法就必須始終返回相同的哈希碼。
因此,基本上,您應該根據Equals
所有使用的字段進行計算,即使它們是可變的。 但是,文檔還指出:
如果確實選擇為可變的引用類型覆蓋
GetHashCode
,則文檔應明確說明,當對象存儲在哈希表中時,該類型的用戶不應修改對象值。
如果只有部分屬性是可變的,則可以覆蓋GetHashCode
以僅基於不可變的屬性進行計算-但是在這種情況下, 所有內容都是可變的,因此您最終將返回一個常量,使它變得難以處理基於哈希的集合。
因此,我建議以下三個選項之一:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.