Object.Equals返回false

时间:2018-08-06 12:10:07

标签: c# oop prototype clone

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;
    }

2 个答案:

答案 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)) ...