Operadores - y -= (referencia de C#)- and -= operators (C# Reference)

El operador - es compatible con los tipos numéricos integrados y los tipos delegados.The - operator is supported by the built-in numeric types and delegate types.

Para obtener información sobre el operador aritmético -, consulte las secciones correspondientes a los operadores unarios más y menos y al operador de resta (-) del artículo Operadores aritméticos.For information about the arithmetic - operator, see the Unary plus and minus operators and Subtraction operator - sections of the Arithmetic operators article.

Eliminación de delegadosDelegate removal

Para los operandos del mismo tipo delegado, el operador - devuelve una instancia de delegado que se calcula de la siguiente manera:For operands of the same delegate type, the - operator returns a delegate instance that is calculated as follows:

  • Si ambos operandos no son nulos y la lista de invocación del segundo operando es una sublista apropiada contigua de la lista de invocación del primer operando, el resultado de la operación es una nueva lista de invocación que se obtiene mediante la eliminación de las entradas del segundo operando de la lista de invocación del primer operando.If both operands are non-null and the invocation list of the second operand is a proper contiguous sublist of the invocation list of the first operand, the result of the operation is a new invocation list that is obtained by removing the second operand's entries from the invocation list of the first operand. Si la lista del segundo operando coincide con varias sublistas contiguas en la lista del primer operando, se quita solo la sublista coincidente más a la derecha.If the second operand's list matches multiple contiguous sublists in the first operand's list, only the right-most matching sublist is removed. Si la eliminación da como resultado una lista vacía, el resultado es 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
    
  • Si la lista de invocación del segundo operando no es una sublista apropiada contigua de la lista de invocación del primer operando, el resultado de la operación es el primer operando.If the invocation list of the second operand is not a proper contiguous sublist of the invocation list of the first operand, the result of the operation is the first operand. Por ejemplo, la eliminación de un delegado que no forma parte del delegado de multidifusión no surte ningún efecto y da como resultado que el delegado de multidifusión no cambie.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
    

    El ejemplo anterior también demuestra que, durante la eliminación de delegados, se comparan las instancias de delegados.The preceding example also demonstrates that during delegate removal delegate instances are compared. Por ejemplo, los delegados que se producen de la evaluación de expresiones lambda idénticas no son iguales.For example, delegates that are produced from evaluation of identical lambda expressions are not equal. Para obtener más información acerca de la igualdad de delegados, consulte la sección Operadores de igualdad de delegado de la especificación del lenguaje C#.For more information about delegate equality, see the Delegate equality operators section of the C# language specification.

  • Si el primer operando es null, el resultado de la operación es null.If the first operand is null, the result of the operation is null. Si el segundo operando es null, el resultado de la operación es el primer operando.If the second operand is null, the result of the operation is the first 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
    

Para combinar delegados, utilice el operador +.To combine delegates, use the + operator.

Para más información sobre los tipos de delegado, vea Delegados.For more information about delegate types, see Delegates.

Operador de resta y asignación (-=)Subtraction assignment operator -=

Una expresión que usa el operador -=, comoAn expression using the -= operator, such as

x -= y

es equivalente ais equivalent to

x = x - y

salvo que x solo se evalúa una vez.except that x is only evaluated once.

En el siguiente ejemplo se muestra el uso del operador -=: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

También se usa el operador -= con el fin de especificar un método de controlador de eventos para eliminar cuando se finaliza la suscripción a un evento.You also use the -= operator to specify an event handler method to remove when you unsubscribe from an event. Para obtener más información, vea Procedimientos para suscribir y cancelar la suscripción a eventos.For more information, see How to: subscribe to and unsubscribe from events.

Posibilidad de sobrecarga del operadorOperator overloadability

Un tipo definido por el usuario puede sobrecargar el operador -.A user-defined type can overload the - operator. Cuando se sobrecarga un operador - binario, el operador -= también se sobrecarga de modo implícito.When a binary - operator is overloaded, the -= operator is also implicitly overloaded. Un tipo definido por el usuario no puede sobrecargar de forma explícita el operador -=.A user-defined type cannot explicitly overload the -= operator.

Especificación del lenguaje C#C# language specification

Para más información, consulte las secciones correspondientes al operador unario menos y al operador de resta de Especificación del lenguaje C#.For more information, see the Unary minus operator and Subtraction operator sections of the C# language specification.

Vea tambiénSee also