Partilhar via


- e -= operadores - subtração (menos)

Os - operadores e são suportados pelos tipos numéricos integrais e -=de vírgula flutuante incorporados e pelos tipos delegados.

Para obter informações sobre o operador aritmético-, consulte as seções Unary mais e menos operadores e Operador de subtração - do artigo Operadores aritméticos.

Remoção do delegado

Para operandos do mesmo tipo de delegado , o - operador retorna uma instância delegada que é calculada da seguinte maneira:

  • Se ambos os operandos não forem nulos e a lista de invocação do operando direito for uma sublista contígua adequada da lista de invocação do operando esquerdo, o resultado da operação será uma nova lista de invocação obtida removendo as entradas do operando direito da lista de invocação do operando esquerdo. Se a lista do operando direito corresponder a várias sublistas contíguas na lista do operando esquerdo, somente a sublista correspondente à direita será removida. Se a remoção resultar em uma lista vazia, o resultado será 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
    
  • Se a lista de invocação do operando direito não for uma sublista contígua adequada da lista de invocação do operando esquerdo, o resultado da operação será o operando esquerdo. Por exemplo, remover um delegado que não faz parte do delegado de multicast não faz nada e resulta no delegado de multicast inalterado.

    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
    

    O exemplo anterior também demonstra que, durante a remoção de delegados, as instâncias delegadas são comparadas. Por exemplo, os delegados que são produzidos a partir da avaliação de expressões lambda idênticas não são iguais. Para obter mais informações sobre igualdade de delegação, consulte a seção Operadores de igualdade de delegados da especificação de linguagem C#.

  • Se o operando esquerdo for null, o resultado da operação será null. Se o operando direito for null, o resultado da operação será o operando esquerdo.

    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
    

Para combinar delegados, use o + operador.

Para obter mais informações sobre tipos de delegados, consulte Delegados.

Operador de atribuição de subtração -=

Uma expressão usando o -= operador, como

x -= y

é equivalente a

x = x - y

só que só é x avaliado uma vez.

O exemplo a seguir demonstra o uso do -= operador:

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

Você também usa o -= operador para especificar um método de manipulador de eventos para remover quando você cancelar a assinatura de um evento. Para obter mais informações, consulte Como se inscrever e cancelar a assinatura de eventos.

Capacidade de sobrecarga do operador

Um tipo definido pelo usuário pode sobrecarregar o - operador. Quando um operador binário - está sobrecarregado, o -= operador também está implicitamente sobrecarregado. Um tipo definido pelo usuário não pode sobrecarregar explicitamente o -= operador.

Especificação da linguagem C#

Para obter mais informações, consulte as seções Unary menos operador e Operador de subtração da especificação da linguagem C#.

Consulte também