2009-03-04 75 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

相关问题