- 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 fornull
, 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#.