对象基类有以下代码,它比较两个对象的相等性
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==objB和objA.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)在这里看起来是多余的。
发布于 2014-06-03 12:30:11
第一个比较是一个简单的引用标识比较-换句话说,objA和objB的值引用同一个对象(或者都是null)。这在Equals(object, object)中有两个目的
EqualsEquals(null, null)返回为真,而不必为其设置特例。objA.Equals(objB)调用虚拟object.Equals(object)方法,可以在子类中重写该方法。( Equals实现通常从我们已经执行的相同的引用比较开始,同样是为了优化目的.两次进行相同的比较有点遗憾,但在我们不需要时避免使用虚拟调用是有意义的。)
例如,string重写Equals,以便两个独立的string对象仍然相等。(string还重载==操作符,使其具有与Equals相同的含义,但这与Equals(object, object)代码无关,因为重载是编译时的问题.== in Equals(object, object)将只执行引用比较。)
编辑:关于“等式定义为引用类型的对象相等,值类型的按位相等”的注释是Equals的默认实现(这是注释发生的地方)。它与==无关,可以通过进一步重写Equals来覆盖该行为。
发布于 2014-06-03 12:28:55
objA==objB检查引用相等性,其中可以重写as objA.Equals(objB)。因此,当引用相等时,显然我们不需要调用Equals方法,它可以执行值相等。
没有必要对引用等式进行比较,我认为这是一种优化,因为值相等可以被重写,而且当它们知道两个引用都是相同的引用时,它们(BCL团队)希望优化的可能是昂贵的实现。
因此,这仅仅是基于这样一个事实:如果引用相等,那么它们的值也是相等的。
发布于 2014-06-03 12:29:16
==检查引用相等性。所有类型都可以覆盖Equals方法,因此调用objA.Equals(objB)的目的是比较基于自定义实现的对象(如果有)。
https://stackoverflow.com/questions/24015159
复制相似问题