【发布时间】:2019-09-16 13:14:33
【问题描述】:
所以我在文章中读到==检查对象引用是否相同.equals()检查数据是否相同但是当我自己编写一些程序时我很困惑。
我有一个班级人,我在我的构造函数中传递了 10,20 现在我创建了另一个对象 p1 和 p2
person p = new person(10,20);
person p1;
p1 = p;
person p2=new person(10,20);
Console.WriteLine(p==p1); //true
Console.WriteLine(p.Equals(p1)); //true
Console.WriteLine(object.ReferenceEquals(p,p1)); //true
Console.WriteLine(p == p2); //false
Console.WriteLine(p.Equals(p2)); //false confusion same data
Console.WriteLine(object.ReferenceEquals(p, p2));//false
现在我对 p.equals(p2) 感到困惑,两者都有相同的数据 10,20 那么为什么 假的
【问题讨论】:
-
因为你没有实现;
Equals()覆盖,==覆盖,也没有实现IEquatable接口,所以它们是不同的对象,所以它们不能相等。 -
==检查两个实例是否是同一个引用(也就是说,它们或多或少指向内存中的同一个对象)。Equals检查内容。但是要让Equals处理自定义类型,您必须重写它。否则它会退回到Object.Equals,它当然不知道自定义类型的属性。 -
如果是这种情况,那么为什么 (p.Equals(p1));是真的 ? @derpirscher
-
我不知道
Object.Equals的确切实现,但它可能会检查引用相等,这当然也意味着相等 -
@derpirscher 您不需要知道确切的实现,因为该方法 Object.Equals 有据可查。如果是引用类型,则 Equals 与 ReferenceEquals 相同
标签: c# equals-operator referenceequals