- 和 -= 运算符 - 减法

内置 整型浮点 数值类型和 委托 类型都支持 --= 运算符。

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

委托删除

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

  • 如果两个作数都是非 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
    

    前面的示例还演示了在删除委托期间对委托实例进行比较。 例如,通过计算相同的 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

还可以使用 -= 运算符指定在取消订阅 事件时要删除的事件处理程序方法。 有关详细信息,请参阅如何订阅和取消订阅事件

运算符可重载性

用户定义的类型可以重载-运算符。 重载< c0 />二元运算符时,< c1 />运算符也会隐式重载。 从 C# 14 开始,用户定义的类型可以显式重载 -= 运算符以提供更高效的实现。 通常,类型重载 -= 运算符,因为可以就地更新值,而不是分配新实例来存储减法结果。 如果类型不提供显式重载,编译器将生成隐式重载。

C# 语言规范

有关详细信息,请参阅 C# 语言规范一元减运算符减法运算符部分。 有关在 C# 14 及更高版本中重载复合赋值运算符的详细信息,请参阅 用户定义的复合赋值 功能规范。

另请参阅