據我所知,只需要重寫它們,如果你需要值相等的語義。 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:成功
爲什麼? foo
和bar
是類的兩個單獨的實例,並設有獨立的引用。引用就像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
檢查。
極好的一點。 – Alan 2009-03-04 00:48:28