从 Microsoft 的文档来看,这两种 Equals 方法本质上是相同的。但是我偶然发现了一些非常奇怪的东西。在我的 Silverlight 项目中,我有两个覆盖 Equals 的相同类的实例。如果我要求inst1.Equals(inst2)或inst2.Equals(inst1)我总是得到真实的结果。但是Object.Equals(inst1, inst2)返回false。这怎么可能?
有任何想法吗?
谢谢,洛克
从 Microsoft 的文档来看,这两种 Equals 方法本质上是相同的。但是我偶然发现了一些非常奇怪的东西。在我的 Silverlight 项目中,我有两个覆盖 Equals 的相同类的实例。如果我要求inst1.Equals(inst2)或inst2.Equals(inst1)我总是得到真实的结果。但是Object.Equals(inst1, inst2)返回false。这怎么可能?
有任何想法吗?
谢谢,洛克
obj1.Equals
假设 obj1 不是null
. object.Equals
甚至适用于null
价值观。但是,这并不能解释您看到的行为;我认为您应该提供一些代码来重现它以获得更好的答案。
obj1.Equals 可以被覆盖,Object.Equals 不能。换句话说,Object.Equals 是 Equals 方法的基本实现,如果您不覆盖它,您可以免费获得它。由于您确实覆盖了它,因此这两种实现是不同的,并且可能会产生不同的结果。
我认为 Object.Equals 将测试 2 个参数是否是相同的引用,即它们指向相同的内存空间。
MyClass.Equals 可能有不同的实现,这样两个引用不同的类实际上可能相等(基于它们的字段和属性)。
注意正确执行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
类中时,它将按预期工作。