- 和 -= 運算子 - 減去 (減)
內建的整數和浮點數數字型別,和委派型別均支援 -
和 -=
運算子。
如需算術 -
運算子的資訊,請參閱算術運算子一文中的一元加號和減號運算子與減法運算子 - 章節。
委派移除
針對相同 delegate 型別中的運算元,-
運算子會傳回委派執行個體,其計算方式如下:
如果兩個運算元都為非 Null,且右邊運算元的引動過程清單是左邊運算元之引動過程清單的適當連續子清單,則作業結果會是新引動過程清單藉由從左邊運算元之引動過程清單來移除右邊運算元的項目所取得。 如果右邊運算元清單與左邊運算元清單中的多個連續子清單相符,則只會移除最右邊的相符子清單。 如果移除導致空白清單,則結果是
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
如果右邊運算元的引動過程清單不是左邊運算元之引動過程清單的適當連續子清單,則作業的結果會是左邊運算元。 例如,移除不屬於多點傳送委派的委派就不會執行任何動作,而且會導致多點傳送委派不變。
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
上述範例也會示範在委派移除期間,系統會比較委派執行個體。 例如,從評估相同 lambda 運算式所產生的委派不相等。 如需有關委派等號比較的詳細資訊,請參閱 C# 語言規格的委派等號比較運算子一節。
如果左邊運算元是
null
,則作業的結果是null
。 如果右邊運算元是null
,則作業的結果是左邊運算元。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
若要結合委派,請使用 +
運算子。
如需委派型別的詳細資訊,請參閱委派。
減法指派運算子 -=
使用 -=
運算子的運算式,例如
x -= y
相當於
x = x - y
但只會評估 x
一次。
下列範例示範 -=
運算子的用法:
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
當您取消訂閱事件時,您也會使用 -=
來指定要移除的事件處理常式方法。 如需詳細資訊,請參閱如何訂閱及取消訂閱事件。
運算子是否可多載
使用者定義型別可以多載-
運算子。 多載二元 -
運算子時,-=
運算子也會隱含地多載。 使用者定義型別無法明確地多載 -=
運算子。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格的一元減號運算子與減法運算子章節。