演算子のオーバーロード

演算子のオーバーロードを使用すると、"+"、"-"、"="、"!=" などの演算子を使って型を結合したり、比較したりできます。 演算子のオーバーロードを型に追加すると、開発者は組み込みのプリミティブ型のように型を使用できます。 演算子のオーバーロードを行うのは、たとえば、数値を表す型の 2 つのインスタンスの追加をサポートするなど、演算の意味が型で直観的に理解できる場合に限る必要があります。 演算子のオーバーロードは、直観的に理解できない演算に構文上のショートカットを提供するために使用しないでください。

次の例は、DateTime クラスの加算演算のシグネチャを示しています。

[Visual Basic]

Public Shared Function op_Addition(ByVal d As DateTime, _
ByVal t As TimeSpan _
) As DateTime

[C#]

public static DateTime op_Addition(
DateTime d, 
TimeSpan t
);

プリミティブ (組み込み) 型のように動作させる型以外では、演算子のオーバーロードを定義しないでください。

プリミティブ型のように動作させる型では、演算子のオーバーロードを定義することを考慮してください。

たとえば、String の場合は、演算子 == と演算子 != を定義します。

数値を表す構造体 (System.Decimal など) では演算子のオーバーロードを定義してください。

演算子のオーバーロードを定義するときは、巧妙にしようとしないでください。 演算子のオーバーロードは、演算の結果がすぐにわかる場合に役立ちます。 たとえば、System.DateTime オブジェクトから別の System.DateTime オブジェクトを減算すると、System.TimeSpan オブジェクトが得られるというような場合には適切です。 一方、論理 union 演算子を使って 2 つのデータベース クエリを結合したり、シフト演算子を使ってストリームに書き込んだりすることは適切ではありません。

オペランドのうち少なくとも 1 つがオーバーロードを定義する型でない限り、演算子のオーバーロードは定義しないでください。

C# コンパイラでは、このガイドラインが適用されます。

演算子は、対称的にオーバーロードしてください。

たとえば、等値演算子をオーバーロードする場合は、非等値演算子もオーバーロードする必要があります。 同様に、小なり演算子をオーバーロードする場合は、大なり演算子もオーバーロードする必要があります。

オーバーロードされた各演算子に対応する表示名をメソッドに付けるようにしてください。

このガイドラインに従って CLS に準拠する必要があります。 演算子記号と、それに対応する代替メソッドおよび演算子名の一覧を次の表に示します。

C# 演算子記号

代替メソッド名

演算子名

定義なし

ToXxx または FromXxx

op_Implicit

定義なし

ToXxx または FromXxx

op_Explicit

+ (二項)

Add

op_Addition

- (二項)

Subtract

op_Subtraction

* (二項)

Multiply

op_Multiply

/

Divide

op_Division

%

Mod

op_Modulus

^

Xor

op_ExclusiveOr

& (二項)

BitwiseAnd

op_BitwiseAnd

|

BitwiseOr

op_BitwiseOr

&&

And

op_LogicalAnd

||

OR

op_LogicalOr

=

Assign

op_Assign

<<

LeftShift

op_LeftShift

>>

RightShift

op_RightShift

定義なし

LeftShift

op_SignedRightShift

定義なし

RightShift

op_UnsignedRightShift

==

Equals

op_Equality

>

CompareTo

op_GreaterThan

<

CompareTo

op_LessThan

!=

Equals

op_Inequality

>=

CompareTo

op_GreaterThanOrEqual

<=

CompareTo

op_LessThanOrEqual

*=

Multiply

op_MultiplicationAssignment

-=

Subtract

op_SubtractionAssignment

^=

Xor

op_ExclusiveOrAssignment

<<=

LeftShift

op_LeftShiftAssignment

%=

Mod

op_ModulusAssignment

+=

Add

op_AdditionAssignment

&=

BitwiseAnd

op_BitwiseAndAssignment

|=

BitwiseOr

op_BitwiseOrAssignment

,

コンマ

op_Comma

/=

Divide

op_DivisionAssignment

--

Decrement

op_Decrement

++

Increment

op_Increment

- (単項)

Negate

op_UnaryNegation

+ (単項)

Plus

op_UnaryPlus

~

OnesComplement

op_OnesComplement

Portions Copyright 2005 Microsoft Corporation. All rights reserved.

Portions Copyright Addison-Wesley Corporation. All rights reserved.

設計ガイドラインの詳細についてを参照してください、「フレームワークの設計ガイドライン。規則、慣用句、および再利用可能なパターン。ネット ライブラリ」本クシシュトフ Cwalina、ブラッド エイブラムス、アスキー、2005 年発表しました。

参照

その他の技術情報

メンバーのデザインのガイドライン

クラス ライブラリ開発のデザイン ガイドライン