Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Object.Equals返回false_C#_Oop_Prototype_Clone - Fatal编程技术网

C# Object.Equals返回false

C# Object.Equals返回false,c#,oop,prototype,clone,C#,Oop,Prototype,Clone,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"); } 克隆方法如

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;
    }
看看这个MSDN

如果当前实例是引用类型,那么Equals(Object)方法 测试引用的相等性,以及对Equals(Object)方法的调用 相当于调用ReferenceEquals方法。参考文献 相等意味着要比较的对象变量引用 同一个物体

您的
Student
是一个引用类型,克隆
MemberwiseClone
返回一个新的其他
对象

Student student = new Student(3, "Jack Poly");
Student otherStudent = (Student)student.Clone();
因此
Equal
必须返回
false

查看此MSDN

如果当前实例是引用类型,那么Equals(Object)方法 测试引用的相等性,以及对Equals(Object)方法的调用 相当于调用ReferenceEquals方法。参考文献 相等意味着要比较的对象变量引用 同一个物体

您的
Student
是一个引用类型,克隆
MemberwiseClone
返回一个新的其他
对象

Student student = new Student(3, "Jack Poly");
Student otherStudent = (Student)student.Clone();

因此,
Equal
必须返回
false

当调用
Clone
时,您将创建一个与原始类具有相同属性和字段的类的全新实例。见:

创建作为当前实例副本的新对象

这两个实例是完全独立的,即使它们在每个属性或字段上引用完全相同的值。特别是改变一个属性不会影响另一个属性

另一方面,
Equals
默认情况下比较两个引用是否相等,这在您的情况下显然是错误的。换句话说:仅仅因为你有两个学生叫马克并不意味着他们是同一个人。您必须实现平等的含义,例如,通过比较sur姓名或其学生身份证号码或两者的组合

您可以在您的
学生
-课程中覆盖
等于

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

调用
Clone
时,将创建一个与原始类具有相同属性和字段的类的全新实例。见:

创建作为当前实例副本的新对象

这两个实例是完全独立的,即使它们在每个属性或字段上引用完全相同的值。特别是改变一个属性不会影响另一个属性

另一方面,
Equals
默认情况下比较两个引用是否相等,这在您的情况下显然是错误的。换句话说:仅仅因为你有两个学生叫马克并不意味着他们是同一个人。您必须实现平等的含义,例如,通过比较sur姓名或其学生身份证号码或两者的组合

您可以在您的
学生
-课程中覆盖
等于

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

因为
Clone
返回两个差异实例。即使这些实例具有相同的属性,它们也不相等,除非您适当地重写
Equals
。您正在执行深度克隆,如果比较项是引用类型,则object.Equals会比较地址。因为
Clone
返回两个不同的实例。即使这些实例具有相同的属性,它们也不相等,除非您适当地重写
Equals
。如果比较项是引用类型,您正在执行深度克隆和object.Equals比较地址。您的
Equals
示例有一个编译器警告,它会隐藏继承的
对象.Equals
。换句话说,
Equals
的正确实现比您的示例复杂得多。您的
Equals
示例有一个编译器警告,它隐藏了继承的
对象。Equals
。换句话说,
Equals
的正确实现要比您的示例复杂得多。