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

4
在Effective C#的第二版(ISBN-13: 978-0321658708)的第37页上,书中写道:

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

然而,在第39页上,书中写道:

问题在于,如果您的类型应该遵循值语义(比较内容)而不是引用语义(比较对象标识),则应编写自己的instance Object.Equals()覆盖

请问有人能够解释为什么要覆盖它吗?

public virtual bool Equals(object right);

而不是

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

谢谢 :)
4个回答

8

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


那肯定是一个合理的理由。谢谢! - Nick Carlson

2
首先要明确的是,您无法覆盖静态方法。实现如下:
public static bool Equals(object left, object right);

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

在您上面提到的引号中,第一个引号是指静态equals方法,而第二个引号是指非静态equals方法,两者都写成Object.Equals()的符号表示形式,但请注意,第一个引号说“static Object.Equals()”


一个非静态方法是一个实例方法,这种说法正确吗? - Nick Carlson
回答我的问题:是的 - Nick Carlson

1
不要重新定义 static Object.Equals()。你应该编写自己的 instance Object.Equals() 覆盖方法。
注意,这两个句子中的关键词是不同的,一个是 static,一个是 instance。它们并不指代同一个方法...

1
此外,如果我没记错的话,静态方法只比较引用,而虚拟方法则允许你编写自己的比较方法,大多数情况下是基于值而不是引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接