等号オーバーライドによる過ち

.net-FrameworkのDictionaryはkey一致の比較にEqualsを使う。
そのためkeyオブジェクトの比較を書き換えたい場合はEqualsをオーバーライドすればいい。

Public Overrides Function Equals(ByVal o As Object) As Boolean
  ''''''''''''''
  ' 特殊な比較処理
  ''''''''''''''
  Return True
End Function

ところがもう一つ施さなければならないことがある。
Hash値が異なればEqualsが呼ばれないからだ。
要はインスタンスが異なってもEqualsが呼ばれるようにGetHashCodeで任意の固定値を返却する。

Public Overrides Function GetHashCode() As Integer
  Return 1
End Function

ただ経験上Equalsのオーバーライドは混乱の元となるように思う。
シンプルで直観的な処理が一番安定するわけだから、この手法はあまり多用しないほうがいいかもしれない。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です