在通过 C# 第 4 版(Microsoft Press)阅读 Jeffrey Richter 的CLR时,作者曾指出,在Object.Equals
当前检查身份相等性时,Microsoft应该已经实现了这样的方法:
public class Object {
public virtual Boolean Equals(Object obj) {
// The given object to compare to can't be null
if (obj == null) return false;
// If objects are different types, they can't be equal.
if (this.GetType() != obj.GetType()) return false;
// If objects are same type, return true if all of their fields match
// Because System.Object defines no fields, the fields match
return true;
}
}
这让我觉得很奇怪:默认情况下,相同类型的每个非空对象都是相等的?因此,除非被覆盖:一个类型的所有实例都是相等的(例如,所有锁定对象都相等),并返回相同的哈希码。并假设==
onObject
仍然检查引用相等,这意味着(a == b) != a.Equals(b)
这也很奇怪。
我认为,如果事物完全相同(身份),则事物平等的想法比仅使一切都平等(除非被覆盖)更好的想法。但这是微软出版的著名书籍的第 4 版,所以这个想法一定有一些可取之处。我阅读了其余的文字,但不禁想知道:作者为什么会提出这个建议?我在这里想念什么?与当前的 Object.Equals 实现相比,Richter 的实现的最大优势是什么?