obj1.Equals(obj2)和c#中的静态Object.Equals(obj1,obj2)有什么区别?

时间:2010-09-13 15:10:59

标签: c# iequatable

来自Microsoft的文档,两种Equals方法基本相同。但我偶然发现了一些非常奇怪的事情。 在我的Silverlight项目中,我有两个同一类的实例覆盖了Equals。 如果我要求 inst1.Equals(inst2) inst2.Equals(inst1),我总是得到 true 作为结果。但是 Object.Equals(inst1,inst2)会返回 false 。这怎么可能?

任何想法?

谢谢, 罗茨科

4 个答案:

答案 0 :(得分:6)

obj1.Equals假设obj1不是nullobject.Equals甚至可以在null值上运行。这并不能解释你所看到的行为;我认为你应该提供一些代码来重现它以获得更好的答案。

答案 1 :(得分:3)

obj1.Equals可以被覆盖,Object.Equals不能。换句话说,Object.Equals是Equals方法的基本实现,如果不覆盖它,则可以免费获得。由于您确实覆盖了它,因此两种实现方式不同,可能会产生不同的结果。

答案 2 :(得分:1)

我认为Object.Equals会测试2个参数是否是相同的引用,也就是说,它们指向相同的内存空间。

MyClass.Equals可能有不同的实现,这样两个不同引用的类实际上可能相等(基于它们的字段和属性)。

答案 3 :(得分:0)

小心正确实施IEquatable<T>。我做了以下错误:

public class SubjectDTO: IEquatable<SubjectDTO>
{
    public string Id;

    public bool Equals(SubjectDTO other)
    {
        return Object.Equals(Id, other.Id);
    }

    public override int GetHashCode()
    {
        return Id == null ? 1 : Id.GetHashCode();
    }
}

看起来不错,对吗?但是当你尝试它时,你会发现令人惊讶的结果:

var a = new SubjectDTO() { Id = "1"};
var b = new SubjectDTO() { Id = "1"};
Console.WriteLine(Object.Equals(a, b));
Console.WriteLine(a.Equals(b));

False
True

咦?好吧,重要的是Equals(object other)

public override bool Equals(object other)
{
    return other == null ? false : Equals(other as SubjectDTO);
}

将它添加到SubjectDTO类时,它将按预期工作。