- と -= 演算子 - 減算 (マイナス)
-
演算子と -=
演算子は、組み込みの整数および浮動小数点型の数値型と、デリゲート型によってサポートされています。
算術演算子 -
については、「算術演算子 (C# リファレンス)」の記事の「単項プラス演算子と単項マイナス演算子」セクションと「減算演算子 -」セクションを参照してください。
デリゲートの削除
同じデリゲート型のオペランドに対しては、-
演算子は、次のように計算されるデリゲート インスタンスを返します。
両方のオペランドが null 値ではなく、右側のオペランドの呼び出しリストが左側のオペランドの呼び出しリストの適切な連続するサブリストの場合は、演算の結果は右側のオペランドのエントリを左側のオペランドの呼び出しリストから削除することによって取得される新しい呼び出しリストとなります。 右側のオペランドのリストが、左側のオペランドのリストで複数の連続するサブリストと一致する場合、右端の一致するサブリストのみが削除されます。 削除によりリストが空になる場合、結果は
null
になります。Action a = () => Console.Write("a"); Action b = () => Console.Write("b"); var abbaab = a + b + b + a + a + b; abbaab(); // output: abbaab Console.WriteLine(); var ab = a + b; var abba = abbaab - ab; abba(); // output: abba Console.WriteLine(); var nihil = abbaab - abbaab; Console.WriteLine(nihil is null); // output: True
右側のオペランドの呼び出しリストが左側のオペランドの呼び出しリストの適切な連続するサブリストでない場合は、演算結果は左側のオペランドになります。 たとえば、マルチキャストのデリゲートの一部ではないデリゲートを削除しても何も行われず、マルチキャストのデリゲートは変更されません。
Action a = () => Console.Write("a"); Action b = () => Console.Write("b"); var abbaab = a + b + b + a + a + b; var aba = a + b + a; var first = abbaab - aba; first(); // output: abbaab Console.WriteLine(); Console.WriteLine(object.ReferenceEquals(abbaab, first)); // output: True Action a2 = () => Console.Write("a"); var changed = aba - a; changed(); // output: ab Console.WriteLine(); var unchanged = aba - a2; unchanged(); // output: aba Console.WriteLine(); Console.WriteLine(object.ReferenceEquals(aba, unchanged)); // output: True
前の例では、デリゲート中に削除デリゲートのインスタンスが比較されることも示しています。 たとえば、同一のラムダ式の評価から生成されるデリゲートが等しくない、などです。 デリゲートの等値の詳細については、C# 言語仕様のデリゲートの等値演算子に関するセクションを参照してください。
左側のオペランドが
null
の場合は、演算結果はnull
になります。 右側のオペランドがnull
の場合は、演算結果は左側のオペランドになります。Action a = () => Console.Write("a"); var nothing = null - a; Console.WriteLine(nothing is null); // output: True var first = a - null; a(); // output: a Console.WriteLine(); Console.WriteLine(object.ReferenceEquals(first, a)); // output: True
デリゲートを組み合わせるには、+
演算子を使用します。
デリゲート型の詳細については、デリゲートに関するページを参照してください。
減算代入演算子 -=
次のような -=
演算子を使用する式があるとします
x -= y
上記の式は、次の式と同じです。
x = x - y
ただし、x
が評価されるのは 1 回だけです。
-=
演算子の使用例を次に示します。
int i = 5;
i -= 9;
Console.WriteLine(i);
// Output: -4
Action a = () => Console.Write("a");
Action b = () => Console.Write("b");
var printer = a + b + a;
printer(); // output: aba
Console.WriteLine();
printer -= a;
printer(); // output: ab
イベントから登録を解除するときに、-=
演算子を使用して削除するイベント ハンドラー メソッドを指定することもできます。 詳細については、「イベントのサブスクリプションとサブスクリプション解除を行う方法」を参照してください。
演算子のオーバーロード可/不可
ユーザー定義型は -
演算子をオーバーロードできます。 2 項 -
演算子をオーバーロードすると、-=
演算子も暗黙的にオーバーロードされます。 ユーザー定義型は、-=
演算子を明示的にオーバーロードできません。
C# 言語仕様
詳細については、C# 言語仕様の単項マイナス演算子と減算演算子に関するセクションを参照してください。
関連項目
.NET