Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Vestavěné celočíselné a plovoucí desetinné typy čísel a typy delegátové všechny podporují operátory -
a -=
.
Informace o aritmetickém -
operátoru naleznete v unární operátor plus a minus a operátor odčítání - části článku Aritmetické operátory .
Odebrání delegáta
Pro operandy stejného typu delegáta-
vrátí operátor instanci delegáta, která se vypočítá takto:
Pokud oba operandy nejsou null a seznam vyvolání pravého operandu je podseznamem seznamu vyvolání levého operandu, výsledkem operace je nový seznam vyvolání, který se získá odebráním položek pravého operandu ze seznamu vyvolání levého operandu. Pokud seznam operandu vpravo odpovídá více souvislým dílčím seznamům v seznamu operandů na levé straně, odebere se pouze odpovídající podsestava zprava. Pokud je výsledkem odebrání prázdný seznam, výsledek je
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
Pokud seznam vyvolání pravého operandu není souvislý a správný podseznam seznamu vyvolání levého operandu, je výsledkem operace levý operand. Odebrání delegáta, který není součástí delegáta vícesměrového vysílání, například nedělá nic a vede k tomu, že se delegát vícesměrového vysílání nezmění.
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
Předchozí příklad také ukazuje, že při odebrání delegátů se instance delegátů porovnávají. Například delegáti, kteří se vytvářejí z vyhodnocení identických výrazů lambda, se nerovnají. Další informace o rovnosti delegátů naleznete v sekci Operátory rovnosti delegátůspecifikace jazyka C#.
Pokud je levý operand
null
, výsledek operace jenull
. Pokud je operand napravonull
, výsledkem operace je levý 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
Ke kombinování delegátů použijte +
operátor.
Další informace o typech delegátů naleznete v tématu Delegáti.
Operátor přiřazení odčítání -=
Výraz používající operátor -=
, například
x -= y
Je ekvivalentní
x = x - y
Kromě toho, že x
se vyhodnotí jenom jednou.
Následující příklad ukazuje použití operátoru -=
:
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
Pomocí operátoru -=
můžete také určit metodu obslužné rutiny události, která se má odebrat při odhlášení odběru události. Další informace najdete v tématu Jak se přihlásit k odběru a odhlášení odběru událostí.
Přetížení operátoru
Uživatelem definovaný typ může přetížení operátor -
. Pokud je binární -
operátor přetížen, je operátor -=
také implicitně přetížen. Počínaje jazykem C# 14 může uživatelem definovaný typ explicitně přetížit -=
operátor, aby poskytoval efektivnější implementaci. Typ obvykle přetěžuje -=
operátor, protože hodnotu lze aktualizovat místo přidělení nové instance k uložení výsledku odčítání. Pokud typ neposkytuje explicitní přetížení, kompilátor vygeneruje implicitní přetížení.
Specifikace jazyka C#
Další informace najdete v částech unárního minus operátoru a operátoru odčítáníspecifikace jazyka C#. Další informace o přetížení operátorů složeného přiřazení v jazyce C# 14 a novějších najdete ve specifikaci funkce složeného přiřazení definované uživatelem .