.Net 【基础回顾】比较比较 Equals ReferenceEquals


对象一致和对象相等

  • 对象一致/the same instance:两个对象是一个实例,引用相同

  • 对象相等/considered equal:指两个对象的值相同,但引用不一定相同

比较运算符==

  1. 引用类型,默认是比较引用的

  2. 值类型默认比较值

  3. string 比较值

Object中的实例方法Equals

  1. 虚方法,需要子类继承重写,默认实现还是比较两者是否为同一个引用

  2. 所有值类型的基类System.ValueType中重写了该方法,用来比较值相等

  3. string 比较值相等

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

considered equal

  1. 引用相同,必定相等

  2. 只有一个null,必定不等

  3. 都不是null,且不是同一个引用,根据left的实例Equals方法判断

  4. 都是null返回true

public static bool Equals(object left, object right)
{
    if(object.ReferenceEquals(left,right)) //如果引用相同,则必定相等(包含两个都是null的情况)
    {
        return true;
    }
    if(object.ReferenceEquals(left ,null)|| object.ReferenceEquals(null,right)) //若只有一个是null,则必定不等
    {
        return false;
    }
    return left.Equals(right);//两个都不是null,且也不是同一个引用,则根据left的实例Equals方法来判断。
}

Object.ReferenceEquals(left, right)静态方法

the same instance

  1. 比较两者是否是相同的引用

  2. 不能重写

  3. 值类型对象的比较永远返回false

  4. 两个null的比较永远返回true