- と -= 演算子 - 減算 (マイナス)

- 演算子と -= 演算子は、組み込みの整数および浮動小数点型の数値型と、デリゲート型によってサポートされています。

算術演算子 - については、「算術演算子 (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# 言語仕様単項マイナス演算子減算演算子に関するセクションを参照してください。

関連項目