- 和 -= 运算符(C# 参考)

内置整型浮点数字类型以及委托类型支持 --= 运算符。

有关算术 - 运算符的信息,请参阅一元加和减运算符算术运算符文章的减法运算符 - 部分。

委托删除

对于委托类型相同的操作数,- 运算符返回如下计算的委托实例:

  • 如果两个操作数都为非空,并且右侧操作数的调用列表是左侧操作数调用列表的正确连续子列表,则该操作的结果是通过从左侧操作数的调用列表中删除右侧操作数的条目而获得的新调用列表。 如果右侧操作数的列表与左侧操作数列表中的多个连续子列表匹配,则仅删除最右侧的匹配子列表。 如果删除行为导致出现空列表,则结果为 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
    

    前面的示例还演示了在删除委托期间对委托实例进行比较。 例如,通过计算相同的 Lambda 表达式生成的委托不相等。 有关委托相等性的详细信息,请参阅 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 只计算一次。

下面的示例演示 -= 运算符的用法:

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# 语言规范

有关详细信息,请参阅 C# 语言规范一元减运算符减法运算符部分。

另请参阅