- および -= 演算子 (C# リファレンス)- and -= operators (C# reference)

- 演算子と -= 演算子は、組み込みの整数および浮動小数点型の数値型と、デリゲート型によってサポートされています。The - and -= operators are supported by the built-in integral and floating-point numeric types and delegate types.

算術演算子 - については、「算術演算子 (C# リファレンス)」の記事の「単項プラス演算子と単項マイナス演算子」セクションと「減算演算子 -」セクションを参照してください。For information about the arithmetic - operator, see the Unary plus and minus operators and Subtraction operator - sections of the Arithmetic operators article.

デリゲートの削除Delegate removal

同じデリゲート型のオペランドに対しては、- 演算子は、次のように計算されるデリゲート インスタンスを返します。For operands of the same delegate type, the - operator returns a delegate instance that is calculated as follows:

  • 両方のオペランドが null 値ではなく、右側のオペランドの呼び出しリストが左側のオペランドの呼び出しリストの適切な連続するサブリストの場合は、演算の結果は右側のオペランドのエントリを左側のオペランドの呼び出しリストから削除することによって取得される新しい呼び出しリストとなります。If both operands are non-null and the invocation list of the right-hand operand is a proper contiguous sublist of the invocation list of the left-hand operand, the result of the operation is a new invocation list that is obtained by removing the right-hand operand's entries from the invocation list of the left-hand operand. 右側のオペランドのリストが、左側のオペランドのリストで複数の連続するサブリストと一致する場合、右端の一致するサブリストのみが削除されます。If the right-hand operand's list matches multiple contiguous sublists in the left-hand operand's list, only the right-most matching sublist is removed. 削除によりリストが空になる場合、結果は null になります。If removal results in an empty list, the result is 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
    
  • 右側のオペランドの呼び出しリストが左側のオペランドの呼び出しリストの適切な連続するサブリストでない場合は、演算結果は左側のオペランドになります。If the invocation list of the right-hand operand is not a proper contiguous sublist of the invocation list of the left-hand operand, the result of the operation is the left-hand operand. たとえば、マルチキャストのデリゲートの一部ではないデリゲートを削除しても何も行われず、マルチキャストのデリゲートは変更されません。For example, removing a delegate that is not part of the multicast delegate does nothing and results in the unchanged multicast delegate.

    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
    

    前の例では、デリゲート中に削除デリゲートのインスタンスが比較されることも示しています。The preceding example also demonstrates that during delegate removal delegate instances are compared. たとえば、同一のラムダ式の評価から生成されるデリゲートが等しくない、などです。For example, delegates that are produced from evaluation of identical lambda expressions are not equal. デリゲートの等値の詳細については、C# 言語仕様デリゲートの等値演算子に関するセクションを参照してください。For more information about delegate equality, see the Delegate equality operators section of the C# language specification.

  • 左側のオペランドが null の場合は、演算結果は null になります。If the left-hand operand is null, the result of the operation is null. 右側のオペランドが null の場合は、演算結果は左側のオペランドになります。If the right-hand operand is null, the result of the operation is the left-hand operand.

    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
    

デリゲートを組み合わせるには、+ 演算子を使用します。To combine delegates, use the + operator.

デリゲート型の詳細については、デリゲートに関するページを参照してください。For more information about delegate types, see Delegates.

減算代入演算子 -=Subtraction assignment operator -=

次のような -= 演算子を使用する式があるとしますAn expression using the -= operator, such as

x -= y

上記の式は、次の式と同じです。is equivalent to

x = x - y

ただし、x が評価されるのは 1 回だけです。except that x is only evaluated once.

-= 演算子の使用例を次に示します。The following example demonstrates the usage of the -= operator:

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

イベントから登録を解除するときに、-= 演算子を使用して削除するイベント ハンドラー メソッドを指定することもできます。You also use the -= operator to specify an event handler method to remove when you unsubscribe from an event. 詳細については、「イベントのサブスクリプションとサブスクリプション解除を行う方法」を参照してください。For more information, see How to subscribe to and unsubscribe from events.

演算子のオーバーロード可/不可Operator overloadability

ユーザー定義型は - 演算子をオーバーロードできます。A user-defined type can overload the - operator. 2 項 - 演算子をオーバーロードすると、-= 演算子も暗黙的にオーバーロードされます。When a binary - operator is overloaded, the -= operator is also implicitly overloaded. ユーザー定義型では、-= 演算子を明示的にオーバーロードできません。A user-defined type cannot explicitly overload the -= operator.

C# 言語仕様C# language specification

詳細については、C# 言語仕様単項マイナス演算子減算演算子に関するセクションを参照してください。For more information, see the Unary minus operator and Subtraction operator sections of the C# language specification.

関連項目See also