C# Object.Equals返回false
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"); } 克隆方法如
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
的正确实现要比您的示例复杂得多。