为什么在.net中存在Equals的静态和非静态重载?

时间:2013-02-12 15:39:34

标签: c# .net equals

为什么.NET的对象类中有Equals two overloads?如果我想要一个自定义相等函数,例如所以我可以使用集合或词典,我应该覆盖它们(除GetHashCode之外),或者它足以覆盖其中一个。

3 个答案:

答案 0 :(得分:8)

您无法覆盖静态版本。

静态版本的原因是您可以在不事先检查空值的情况下调用object.Equals(myObject, myOtherObject)

在内部,它只检查空值(如果两个对象都为空,则返回true),然后委托给myObject.Equals(myOtherObject)。所以你需要覆盖非静态Equals方法。

答案 1 :(得分:2)

您无法覆盖静态方法。

只覆盖非静态方法,它会没事......

阅读这篇文章: How to: override static methods

  

为什么我们不能覆盖静态成员?

     

真的,为什么?如果你考虑一下,这只是常识。   覆盖通常(实例)成员使用虚拟分派   将合同与实施分开的机制。该   合同在编译时是已知的(实例成员签名),但是   实现仅在运行时已知(具体类型的对象   提供了一个具体的实现)。你不知道具体的类型   编译时的实现。

     

这是一个重要的事情要理解:当类型继承自   其他类型,他们履行共同的合同,而静态类型   不受任何合同约束(从纯OOP的角度来看)。有   语言中没有技术方法可以将两种静态类型绑定在一起   一份“继承”合同。如果要“覆盖”Log方法   两个不同的地方,我们怎么知道我们在这里打电话给哪一个:   Log.Message(“什么是实现?”)

     

使用静态成员,可以通过显式指定类型来调用它们   它们的定义。这意味着,你直接打电话给   实施,再次,不受任何合同约束。

     

顺便说一下,这就是静态成员无法实现接口的原因。和   这就是为什么虚拟调度在这里没用 - 直接所有客户端   在没有任何合同的情况下调用实现。

答案 2 :(得分:1)

如果“first”对象为null,则存在静态方法。例如,如果a为空并且b不为空,则您将无法运行a.Equals(b),但您将能够运行object.Equals(a, b)

您应该(并且可以)仅覆盖实例方法,原因有两个。首先,您不能覆盖静态方法。其次,静态方法最终将调用非静态方法。

有关详细信息,请参阅documentation

相关问题