演算子のオーバーロード
演算子のオーバーロードを使用すると、"+"、"-"、"="、"!=" などの演算子を使って型を結合したり、比較したりできます。 演算子のオーバーロードを型に追加すると、開発者は組み込みのプリミティブ型のように型を使用できます。 演算子のオーバーロードを行うのは、たとえば、数値を表す型の 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 年発表しました。