C# Equals和ReferenceEquals区别

本文为新手提供了Equals和ReferenceEquals的使用场景,每次打开Object 类,都可以看到

Object 类的这几个方法,其实英语好的同学大概看了就会运用
       

 //
        // 摘要:
        //     Determines whether the specified object instances are considered equal.
        // 返回结果:
        //     true if the objects are considered equal; otherwise, false. If both objA and
        //     objB are null, the method returns true.
        public static bool Equals(Object? objA, Object? objB);
        //
        // 摘要:
        //     Determines whether the specified System.Object instances are the same instance.
        // 返回结果:
        //     true if objA is the same instance as objB or if both are null; otherwise, false.
        public static bool ReferenceEquals(Object? objA, Object? objB);
        //
        // 摘要:
        //     Determines whether the specified object is equal to the current object.
        // 返回结果:
        //     true if the specified object is equal to the current object; otherwise, false.
        public virtual bool Equals(Object? obj);

 先总结结论,后分析源码

1)public static bool Equals(Object? objA, Object? objB)

这个方法呢,是静态的,值类型和引用类型都可以进行比较,主要比较两个对象是否相同

  • objAobjB都为null时,返回true
  • objAnullobjBnull时,返回false
  • 否则,使用objA.Equals(objB)方法来比较两个对象的相等性。

 public static bool ReferenceEquals(Object? objA, Object? objB)

  • 这是一个静态方法,用于比较两个对象的引用是否相等。
  • objAobjB引用同一个对象时,返回true。否则,返回false
  • 注意这个只能比较class ,不能比较 struct 类型,也就是引用类型比较用ReferenceEquals
  • 引用类型也可以使用==替换ReferenceEquals

public virtual bool Equals(Object? obj)

  • 这是一个虚方法,用于比较当前对象与给定对象的相等性。
  • 默认实现是使用ReferenceEquals(this, obj)来判断两个对象的引用是否相等。
  • 通常,需要重写该方法来根据对象的内容进行相等性比较

再进行源码分享: 

// System.Runtime.CompilerServices.RuntimeHelpers
//这个是实例方法的比较调用

public static bool Equals(object? objA, object? objB)
{
    if (objA == objB)
    {
        return true;
    }
    if (objA == null || objB == null)
    {
        return false;
    }
    return objA.Equals(objB);

     //objA 调用了 下面的 Equals
}

public virtual bool Equals(object obj)
{
    return RuntimeHelpers.Equals(this, obj);
}

ReferenceEquals源码

public static bool ReferenceEquals(object? objA, object? objB)
{
    return objA == objB;
}

虚方法  Equals 源码,可以看出 静态方法和 虚方法Equals ,不同是加了引用判断和为空判断

public virtual bool Equals(object obj)
{
    return RuntimeHelpers.Equals(this, obj);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值