次の方法で共有


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

組み込みの 整数 型と 浮動小数点 数値型と デリゲート 型はすべて、 - 演算子と -= 演算子をサポートします。

算術-演算子の詳細については、算術演算子に関する記事の「単項正負演算子」および「減算演算子 - 」セクションを参照してください。

デリゲートの削除

同じ デリゲート 型のオペランドの場合、 - 演算子は、次のように計算されるデリゲート インスタンスを返します。

  • 両方のオペランドが 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

また、 -= 演算子を使用して、イベントからサブスクライブを解除するときに削除する イベント ハンドラー メソッドを指定します。 詳細については、「イベントを登録および登録解除する方法」を参照してください。

演算子のオーバーロード可能性

ユーザー定義型は、演算子を-できます。 バイナリ - 演算子がオーバーロードされると、 -= 演算子も暗黙的にオーバーロードされます。 C# 14 以降では、ユーザー定義型は -= 演算子を明示的にオーバーロードして、より効率的な実装を提供できます。 通常、減算の結果を格納するために新しいインスタンスを割り当てるのではなく、値を in-place で更新できるため、型は、-= 演算子をオーバーロードします。 型が明示的なオーバーロードを提供しない場合、コンパイラは暗黙的なオーバーロードを生成します。

C# 言語仕様

詳細については、C# 言語仕様単項マイナス演算子減算演算子のセクションを参照してください。 C# 14 以降での複合代入演算子のオーバーロードの詳細については、 ユーザー定義の複合代入 機能の仕様を参照してください。

こちらも参照ください