对象的判等

1. ==操作符

两个引用类型的对象(类型继承自System.Object),当使用==操作符来判断是不是相等时,编译器总是生成判断这两个对象的引用是不是相同的中间代码IL。因此==操作符对于两个引用类型的对象而言是等价于静态方法 Object.ReferenceEquals(Object objA, Object objB)的,但为了语义更加清晰,我们应该使用Object.ReferenceEquals方法来明确地表达代码的目的是为了判断两个对象是不是引用相同

2. 静态方法 Object.Equals(object left, object right)

这个方法首先通过==操作符来判断两个对象是不是引用相等,是则返回true,然后判断两个对象是不是有null,有就返回false,最后调用对象实例的Equals方法来判断是不是相等,代码如下:

public static bool Equals(object left, object right)

{

  if (left == right)

  return true;

if (left == null || right == null)

return false;

return left.Equals(right);

}

3. 实例方法Equals(object right)

在System.Object类中,实例方法 Equals被声明为虚方法,因此是可以被继承类override的。如果不override这个方法,那么它的行为跟ReferenceEquals完全一样。当我们自己声明的类对象,判等的语义要求不是引用相同时,就需要override这个实例方法,来实现我们自己的语义,比如:

class A

{

public string Name {get; set;}

public override bool Equals(object right)

{

//引用相同就认为是相等的

  if (Object.ReferenceEquals(right))

{

return true;

}

//因为this肯定不是null,所以right是null的话,一定不等

if (right == null)

{

  return false;

}

//这里我们实现了语义为:只要两个对象的Name属性相等,我们就认为这两个对象相等(尽管我还没看见过这样怪异的需求)

if (this.Name == right.Name)

{

return true;

}

return false;

}

}

原文地址:https://www.cnblogs.com/lbsong/p/1657086.html