Jeffrey Richter のCLR を C# 第 4 版(Microsoft Press) で読んでいるときに、著者はある時点で、Object.Equals
現在 ID の等価性をチェックしているが、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;
}
}
これは非常に奇妙に思えます。同じタイプの null 以外のオブジェクトはすべてデフォルトで等しいのでしょうか? したがって、オーバーライドされない限り、型のすべてのインスタンスは等しく (たとえば、すべてのロック オブジェクトが等しい)、同じハッシュ コードを返します。==
そして、 onObject
がまだ参照の等価性をチェックしていると仮定すると、これは(a == b) != a.Equals(b)
どちらも奇妙になることを意味します。
オーバーライドされない限り、すべてを等しくするよりも、まったく同じもの (同一性) であれば等しいという考えの方が良いと思います。しかし、これはマイクロソフトが発行した有名な本の第 4 版であるため、このアイデアには何らかのメリットがあるはずです。私はテキストの残りの部分を読みましたが、疑問に思わずにはいられませんでした:なぜ著者はこれを提案したのでしょうか? ここで何が欠けていますか?現在の Object.Equals 実装に対する Richter の実装の大きな利点は何ですか?