內建的 代理 類型以及 積分 與 浮點 數值類型皆支援 - and -= 運算子。
C# 語言參考資料記錄了 C# 語言最新版本。 同時也包含即將推出語言版本公開預覽功能的初步文件。
文件中標示了語言最近三個版本或目前公開預覽版中首次引入的任何功能。
小提示
欲查詢某功能何時首次在 C# 中引入,請參閱 C# 語言版本歷史的條目。
如需算術-運算子的相關資訊,請參閱一元加號和減號運算子及減法運算子 -等算術運算子文章的章節。
委派移除
對於 相同代理 類型的運算元, - 運算元會回傳一個代理實例,計算方式如下:
若兩個運算元都不是
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# 14 開始,使用者自訂型別可以明確超載運算 -= 子,以提供更有效率的實作。 一般而言,型別會對-= 運算符進行多載,因為值可以就地更新,而不需要分配新的實例來儲存減法結果。 如果類型未提供明確的多載,編譯程式會產生隱含多載。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格的一元減號運算符和減法運算符區段。 如需 C# 14 和更新版本中有關複合指派運算子多載的詳細資訊,請參閱 使用者定義複合指派 的功能規格。