Object.Equals总是返回false,为什么不等于?
Student student = new Student(3, "Jack Poly");
Student otherStudent = (Student)student.Clone();
if (Object.Equals(student, otherStudent))
{
Console.WriteLine("Equal");
}
else
{
Console.WriteLine("Not Equal");
}
如下所示的克隆方法
public override StudentPrototype Clone()
{
return this.MemberwiseClone() as StudentPrototype;
}
答案 0 :(得分:4)
看看这个article MSDN
如果当前实例是引用类型,则使用Equals(Object)方法 测试引用相等性,并调用Equals(Object)方法 等效于对ReferenceEquals方法的调用。参考 相等意味着比较的对象变量引用 相同的对象。
您的Student
是引用类型,克隆MemberwiseClone
返回另一个新的object
。
Student student = new Student(3, "Jack Poly");
Student otherStudent = (Student)student.Clone();
因此Equal
必须返回false
答案 1 :(得分:1)
调用Clone
时,您将创建一个类的全新实例,该实例具有与原始属性和字段相同的属性和字段。参见MSDN:
创建新对象,它是当前实例的副本
两个实例都是完全独立的,即使它们在每个单个属性或字段上引用的值完全相同。特别是,更改一个属性不会影响另一个属性。
另一方面,默认情况下,Equals
比较两个引用是否相等,这在您的情况下显然是错误的。换句话说:仅仅因为您有两个名叫Marc的学生并不意味着他们是同一个人。您必须实现平等的含义,例如通过比较姓氏或学生的身份证号或两者的组合。
您可以在Equals
类中覆盖Student
:
class Student
{
public override bool Equals(object other)
{
var student = other as Student;
if(student == null) return false;
return this.Name == student.Name;
}
}
并使用它:
if (student.Equals(otherStudent)) ...