2009-03-04 60 views
4

好吧,所以如果我重寫等於,我需要重寫GetHashCode,反之亦然。我是否需要在新類中重寫GetHashCode和Equals?

但我只是想知道:我應該在任何課程中總是重寫這兩個嗎?特別是如果我知道我會在字典或類似的集合中使用它們?雖然這是fairly straight forward,但對於每個班級來說這仍然是一項額外的工作。

是否System.Object的實現不夠擔心這個問題?

編輯:你可以詳細介紹一下什麼是值和引用相等?所以如果我有兩個字符串(s1和s2)都是「測試」,它們的值是相等的,但由於它們是兩個不同的字符串,它們不是引用相等的嗎?好的,對於字符串來說,這是一件不容易的事情,但您希望引用或Value Equality的常見情況是什麼?

回答

6

據我所知,只需要重寫它們,如果你需要值相等的語義。 System.Object的實現不是'壞',它只是一個引用檢查(這是所有級別的實現都可以)。

簡而言之:如果你需要某種基於價值的平等(基於類的屬性的平等),那麼是的,重寫掉。否則,它應該已經不錯了。

編輯: 你只需要覆蓋它們在上述情況下。如果你重寫一個,你確實需要覆蓋兩個顯而易見的原因(他們需要一致,等等)。您可以覆蓋他們在每類在其他的答案中描述的其他原因(如性能在使用的哈希值,即算法。Dictionary鍵等),但你並不需要,默認System.Object實現將正常工作。

編輯2: 更多信息請求,所以在這裏。請看下面的僞類:

public class User { 
    private int _id; 
    private string _username; 
    public string Username { get {return _username;}}; 
    // [snip] Whatever other properties we might like to have. 

    public User(string username) { 
     // Initialise our user from a database, or whatever. 
    } 
} 

既然這樣,下面的代碼,似乎直觀:

User foo = new User("me"); 
User bar = new User("me"); 
User baz = foo; 

if (foo.Equals(bar)) { 
    Console.WriteLine("1: Success!"); 
} 
if (foo.Equals(baz)) { 
    Console.WriteLine("2: Success!"); 
} 

但它只會打印出:

2:成功

爲什麼? foobar是類的兩個單獨的實例,並設有獨立的引用。引用就像C/C++中的指針。 foo和baz是相同的參考,因爲一個是從另一個分配的。他們都有相同的價值雖然,用戶稱爲「我」。基於價值的樣本實現.Equals實現可能是:

partial class User { 
    public override bool Equals(object b) { 
     if (b == null) return false; 
     if (b.GetType() != this.GetType()) return false; 

     // Now the heavy lifting 
     User other = (User)b; 
     if (other._id == this._id) return true; 
     else return false; 
    } 
} 

看看它是如何檢查反對階級屬性的一部分,以確定平等?這是工作中的價值平等。參考平等只是一個簡單的this == b檢查。

2

只有當你想要的語義值。從MSDN

對於某些類型的對象,它是 需要具有的Equals測試 價值的平等,而不是引用 平等。如果兩個對象 具有相同的值,即使它們不是 不等同的實例,等於 的這種實現也會返回true。構成對象值 的定義 取決於類型的實現者 ,但它通常是存儲在對象的實例變量 中的部分或全部數據。例如,字符串的值 基於字符串的字符 ;等於方法 String類爲任何 兩個字符串實例返回true,該字符串包含 完全相同的字符 相同的順序。

3

這兩種方法應該是一致的。換句話說,如果兩個對象是等於,則每個應該返回相同的散列碼。這在哈希集合中尤爲重要。要找到與散列容器中的對象X匹配的對象,容器將僅測試那些與X具有相同散列代碼的相等項。

+0

極好的一點。 – Alan 2009-03-04 00:48:28

相關問題