內建 整數 和 浮點 數值類型和 委派 型別全都支援 - 和 -= 運算元。
如需算術-運算子的相關資訊,請參閱一元加號和減號運算子及減法運算子 -等算術運算子文章的章節。
委派移除
針對相同 委派 類型的運算元,- 運算符會傳回一個按以下方式計算的委派實例:
如果兩個運算元都非 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 和更新版本中有關複合指派運算子多載的詳細資訊,請參閱 使用者定義複合指派 的功能規格。