==演算子とEqualsメソッド

[Equals を使うな。使う事を推奨するな。]

一部のコーディング規約で Equals を推奨しているのを見かけたので書かせて頂きました。

ひどいコーディング規約があるなあ。

そう思いつつ、上の記事も、ちょっと書き方が悪い*1

まず、==演算子は「2つのオブジェクトが『同値』*2かどうかを判断する」、Equalsメソッドは「2つのオブジェクトが『同等』*3かどうかを判断する」もの。Equalsメソッドは、オブジェクトの中身じゃなくて、オブジェクトそのものをあつかうメソッドだから、コンパイル時に型をチェックするという性質のものじゃない。

Equals はタイプセーフではない。このため、型のエラーの発見が遅れる。

この書き方だとEqualsメソッドが危険なもののように読める。Equalsメソッドは、objectを引数にとるわけで、それが本来の動作でもある。コンパイル時にコンパイラが何もいわないのは、それで正しいわけで、この書き方はちょっとよろしくないように思う。
Equalsメソッドを推奨していることが問題なのは、==演算子とEqualsメソッドは異なる目的のためにあるものなのに、それを同じもののように理解してしまっていること。おなじものと思って使えば、同値と判断してtrueが返って欲しいところで、falseが返ることになるようなことが起きる。==演算子とEqualsメソッドを同じものと考えているだけに、わかりにくいバグの原因になる。型のエラーの発見が遅れるとかは副次的なものじゃなかろうか。

*1:古い記事なんで、今さらツッコミをいれなくてもいいような気もするけど……。

*2:MSDNでは「値の等価」というふうにも書いている。

*3:この書き方はMSDNから。MSDNでは他に「参照の等価」というふうにも書いている。ネットを見ていると『同一』と書いている人もいるな。