[C#] 演算子のオーバーローディング

+や-のような演算子をclassごとの使い方を定義する。
たとえば、string1 + string2 や、date1 + date2 のようにclassごとの新しい定義を作る。

public static int operator - (SuperDate sdLeft, SuperDate sdRight)
{
return sdLeft.CommonEraDay - sdRight.CommonEraDay;
}

C#のコンパイラでは、op_Subtraction()というmethodが生成される。
二項演算子(binary operator)で、右と左が入れ替わる交換律がなりたつ場合には、両方を定義しておかなければならない。
==と!=演算子のオーバーロードを定義する場合には、EqualsとGetHashCodeも定義するようにwarningが出る。
Equalsは比較して同じであればtrueを返す。
GetHashCodeは32bitの整数のhashを返す。objectごとに完全に一意なhash codeを返すことはできないしその必要はない。
Equalsでtrueが返る2つのobjectにはGetHashCodeが同じhash codeを返すことが必要。
Equals methodは例外を発生させてはいけないとSystem.ObjectのEqualsのドキュメントに書かれている。nullや違うclassのobjectに対しても例外を発生させないように実装する。

public override bool Equals(object obj)
{
return obj is SuperDate && this == (SuperDate) obj;
}

ここでは == がすでに定義されているのでそれを使う。
explicit cast演算のオーバーロードには explicitキーワード使う。
SuperDateのobjectをintにcastする場合。

public static explicit operator int (SuperDate sd)
{
return sd.CommonEraDay;
}

implicit castにはimplicitキーワードを使用する。

広告
%d人のブロガーが「いいね」をつけました。