var A = new obj(1,2,3); //parameters are just used to set some fields no randomness is involved
var B = A;
var C = new obj(1,2,3);
我想确定我的理解是否正确
Equals()
是否比较了2个对象之间所有字段和属性的值,是否可以肯定地信任它?
Equals()
也使用反射吗?
答案 0 :(得分:11)
这取决于你如何写它。
基本object.Equals()
方法严格按引用比较实例。
您可以在自己的课程中覆盖Equals()
以执行任何操作。
最后,ValueType.Equals()
(由所有结构继承)使用反射按值进行比较;你应该在制作自己的结构时重写它。
答案 1 :(得分:4)
根据MSDN:
当前实例与obj参数之间的比较类型取决于当前实例是引用类型还是值类型。
http://msdn.microsoft.com/en-us/library/bsc2ak47(v=vs.110).aspx
答案 2 :(得分:1)
object.Equals
(instance)方法在运行时解析,取决于您比较的类型。
如果您比较值类型,它会解析为值比较,如果您在引用类型上使用它,它会比较引用。
答案 3 :(得分:1)
Equals()
需要由班级作者实施。如果不这样做,将对引用类型进行引用比较,并对值类型进行值比较。对于新值类型,强烈建议覆盖Equals()
。
答案 4 :(得分:0)
根据msdn: 如果当前实例是引用类型,则Equals(Object)方法测试引用相等性,并且对Equals(Object)方法的调用等效于对ReferenceEquals方法的调用
答案 5 :(得分:-1)
您可以在任何实现具有Equals()方法的IEquatable<T>,
的类中使用Equals。在封面下,在对象上调用GetHashCode()。因此,您可以拥有两个具有相同属性但不相等的对象,因为它们是具有不同哈希码的不同实例。
为了将自定义类与Equals进行比较,您需要实现IEquatable<T>
接口并在Equals方法中提供自己的代码,例如比较属性值。
例如:
public class Person : IEquatable<Person>
{
public string FirstName {get;set;}
public string LastName {get;set;}
public bool Equals(Person other)
{
return this.FirstName == other.FirstName
&& this.LastName == other.LastName;
}
public override int GetHashCode()
{
return this.FirstName.GetHashCode() ^ this.LastName.GetHashCode;
}
}
您将需要提供比示例更好的哈希代码方法。您现在可以使用Equals()和比较属性值来比较自定义对象。