- i -= operatory - odejmowanie (minus)

Operatory - i są obsługiwane przez wbudowane typy liczb całkowitych i zmiennoprzecinkowych oraz typy delegatów-=.

Aby uzyskać informacje na temat operatora arytmetycznego - , zobacz artykuł Jednoargumentowe operatory plus i minus oraz operator odejmowania — sekcje operatorów arytmetycznych.

Usuwanie delegatów

W przypadku operandów tego samego typu - delegata operator zwraca wystąpienie delegata obliczane w następujący sposób:

  • Jeśli oba operandy są inne niż null, a lista wywołań operandu po prawej stronie jest właściwą ciągłą podlistą listy wywołań operandu po lewej stronie, wynikiem operacji jest nowa lista wywołań uzyskana przez usunięcie wpisów prawego operandu z listy wywołań operandu po lewej stronie. Jeśli lista operandu po prawej stronie pasuje do wielu ciągłych podlist w liście operandu po lewej stronie, zostanie usunięta tylko najbardziej zgodna lista podrzędna z prawej strony. Jeśli usunięcie spowoduje wyświetlenie pustej listy, wynikiem jest 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
    
  • Jeśli lista wywołań operandu po prawej stronie nie jest odpowiednią ciągłą podlistą listy wywołań operandu po lewej stronie, wynikiem operacji jest operand po lewej stronie. Na przykład usunięcie delegata, który nie jest częścią delegata multiemisji, nie robi nic i powoduje niezmieniony delegat multiemisji.

    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
    

    W poprzednim przykładzie pokazano również, że podczas delegowania wystąpień delegatów są porównywane. Na przykład delegaty generowane na podstawie oceny identycznych wyrażeń lambda nie są równe. Aby uzyskać więcej informacji na temat równości delegatów, zobacz sekcję Delegowanie operatorów równości specyfikacji języka C#.

  • Jeśli operand po lewej stronie to null, wynikiem operacji jest null. Jeśli operand po prawej stronie to null, wynikiem operacji jest operand po lewej stronie.

    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
    

Aby połączyć delegatów, użyj + operatora .

Aby uzyskać więcej informacji na temat typów delegatów, zobacz Delegaty.

Operator przypisania odejmowania -=

Wyrażenie używające -= operatora, na przykład

x -= y

jest równoważny

x = x - y

z wyjątkiem tego, że x jest obliczany tylko raz.

W poniższym przykładzie pokazano użycie -= operatora:

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

Operator służy -= również do określania metody obsługi zdarzeń, która ma być usuwana po anulowaniu subskrypcji zdarzenia. Aby uzyskać więcej informacji, zobacz Jak subskrybować i anulować subskrypcję zdarzeń.

Przeciążenie operatora

Typ zdefiniowany przez użytkownika może przeciążyć - operatora. Gdy operator binarny - jest przeciążony, -= operator jest również niejawnie przeciążony. Typ zdefiniowany przez użytkownika nie może jawnie przeciążyć -= operatora.

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz sekcje jednoargumentowego operatora minus i operatora odejmowania specyfikacji języka C#.

Zobacz też