首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象相等

对象相等
EN

Stack Overflow用户
提问于 2014-06-03 12:26:51
回答 4查看 185关注 0票数 0

对象基类有以下代码,它比较两个对象的相等性

代码语言:javascript
复制
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==objBobjA.Equals(objB)有什么区别,为什么我们需要单独检查objA==objB

更新:源代码中的评论是"Equality is defined as object equality for reference types and bitwise equality for value types“。因此,如果我们处理引用类型和objA!=objB,那么我们必须在没有其他比较的情况下返回false,不是吗?objA.Equals(objB)在这里看起来是多余的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-06-03 12:30:11

第一个比较是一个简单的引用标识比较-换句话说,objAobjB的值引用同一个对象(或者都是null)。这在Equals(object, object)中有两个目的

  • 这是一种优化,所以当我们比较一个对象和它本身时,我们不需要实际调用Equals
  • 这使得Equals(null, null)返回为真,而不必为其设置特例。

objA.Equals(objB)调用虚拟object.Equals(object)方法,可以在子类中重写该方法。( Equals实现通常从我们已经执行的相同的引用比较开始,同样是为了优化目的.两次进行相同的比较有点遗憾,但在我们不需要时避免使用虚拟调用是有意义的。)

例如,string重写Equals,以便两个独立的string对象仍然相等。(string还重载==操作符,使其具有与Equals相同的含义,但这与Equals(object, object)代码无关,因为重载是编译时的问题.== in Equals(object, object)将只执行引用比较。)

编辑:关于“等式定义为引用类型的对象相等,值类型的按位相等”的注释是Equals的默认实现(这是注释发生的地方)。它与==无关,可以通过进一步重写Equals来覆盖该行为。

票数 3
EN

Stack Overflow用户

发布于 2014-06-03 12:28:55

objA==objB检查引用相等性,其中可以重写as objA.Equals(objB)。因此,当引用相等时,显然我们不需要调用Equals方法,它可以执行值相等。

没有必要对引用等式进行比较,我认为这是一种优化,因为值相等可以被重写,而且当它们知道两个引用都是相同的引用时,它们(BCL团队)希望优化的可能是昂贵的实现。

因此,这仅仅是基于这样一个事实:如果引用相等,那么它们的值也是相等的。

票数 3
EN

Stack Overflow用户

发布于 2014-06-03 12:29:16

==检查引用相等性。所有类型都可以覆盖Equals方法,因此调用objA.Equals(objB)的目的是比较基于自定义实现的对象(如果有)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24015159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档