据我所知,只需要重写它们,如果你需要值相等的语义。 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