c#中的等于按引用或值进行比较吗?

时间:2014-01-01 18:00:44

标签: c# .net

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

我想确定我的理解是否正确

  • A.Equals(B).Equals(C)(true)
  • A == C(假)
  • A == B(true)

Equals()是否比较了2个对象之间所有字段和属性的值,是否可以肯定地信任它?

Equals()也使用反射吗?

6 个答案:

答案 0 :(得分:11)

这取决于你如何写它。

基本object.Equals()方法严格按引用比较实例。

您可以在自己的课程中覆盖Equals()以执行任何操作。

最后,ValueType.Equals()(由所有结构继承)使用反射按值进行比较;你应该在制作自己的结构时重写它。

答案 1 :(得分:4)

根据MSDN:

当前实例与obj参数之间的比较类型取决于当前实例是引用类型还是值类型。

  • 如果当前实例是引用类型,则为Equals(Object) 方法测试引用相等,并调用Equals(Object) 方法相当于对ReferenceEquals方法的调用。 引用相等意味着要比较的对象变量 引用同一个对象。
  • 如果当前实例是值类型,则为Equals(Object)方法 测试价值平等。

http://msdn.microsoft.com/en-us/library/bsc2ak47(v=vs.110).aspx

答案 2 :(得分:1)

object.Equals(instance)方法在运行时解析,取决于您比较的类型。

如果您比较值类型,它会解析为值比较,如果您在引用类型上使用它,它会比较引用。

http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

答案 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()和比较属性值来比较自定义对象。