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