2021-10-15
C# operator==の話
c#は独自クラスであってもoperator==
やoperator<
などを定義することで。プリミティブ型のように比較できることを知った。演算子をオーバーロードできる言語だったとは知らず、割と驚いた。
しかし、このあたりの実装はc++のように単純ではないようだ。
そもそも、c#はobjectを比較する方法が沢山あってややこしい。==
だけでなく、object.Equals()
、IEquatable<T>
を継承して実装するTypeSafeなobject.Equals()
、object.ReferenceEquals()
などが最初から用意されている。
c#ではstructとclassを明確に使い分けており、classは参照型のため、==演算子はデフォルトで参照の等価性を評価する。operator==
を上書きすることで値の比較に変えることができるが、その場合は他のメソッドも上書きすることを求められるようだ(例えばHashCode()
とか)。
あと地味に罠なのがnullチェックだ。
public static operator==(Type a, Type b)
{
if (a == null || b == null) ...
}
と書くと、==演算子で再帰してしまう。
public static operator==(Type a, Type b)
{
if (a is null || b is null) ...
}
と書かないといけないようだ。
演算子==の定義を変えるのは割と厄介だった。あまり乱用しない方がいいのかもしれない。