有效的C#:覆盖Object.Equals(),不管是不是?

时间:2011-05-10 15:09:49

标签: c# override equals

在第37页的Effective C#第二版(ISBN-13:978-0321658708)中,本书内容为

  

你永远不会重新定义的第二个函数是静态Object.Equals()

但是,在第39页上,该书的内容为

  

关键是如果你的类型应该遵循值语义(比较内容)而不是引用语义(比较对象标识),你应该编写自己的实例Object.Equals()

有人会如此善意地解释为什么会覆盖

public virtual bool Equals(object right);

而不是

public static bool Equals(object left, object right);

谢谢:)

4 个答案:

答案 0 :(得分:8)

因为你无法覆盖静态方法。

答案 1 :(得分:2)

要清除的第一件事是你不能覆盖静态方法。

的实施
public static bool Equals(object left, object right);

无法覆盖。静态equals方法仅用于不进行空检查。在内部,它首先检查引用等于然后内容等于(非静态等于方法)。

在上面提到的引号中,第一个引用引用静态equals方法,其中第二个引用非静态equals方法,两者都以符号形式写为Object.Equals(),但注意第一个引用“static Object.Equals”( )“

答案 2 :(得分:1)

  

永远不会重新定义静态 Object.Equals()

     

您应该编写自己的实例 Object.Equals()

覆盖

注意区别,静态 vs 实例。这些句子并不是指同一种方法......

答案 3 :(得分:1)

另外,如果我没有弄错的话,静态的只会比较参考,其中虚拟参考可以编写自己的比较,大部分时间都是基于值而不是参考。