C# 14 新功能 使用者定義的複合指派運算子

複合指派運算子 (compound assignment operators) 早就存在於 C# 中,在 C# 14 開放了可以自行定義這類複合運算子的功能,本篇文章說明如何自行定義,且這個自行定義在程式上的意義又有甚麼不一樣。

以前

過去在 C# 中的複合指派運算子可以視為是一種語法糖,以  i += j  為例,會被拆解成 i = i + j,所以在相加的部分其實還是倚賴 + 運算子,使用者無法自行定義複合指派的行為模式。

現在

C# 14 推出了一個新的功能 – 使用者定義的複合指派運算子 (user-defined compound assignment operators),這允許了開發者可以為型別設計自定義的複合指派運算子。這個新功能賦予複合運算兩個用途。

  1. 效能:原有語法糖的方式無可避免的會在複合運算期間建立暫存變數或物件,當複合運算非常頻繁的時候就可能成為效能瓶頸,而自定義複合指派運算子可以避免這個情形。
  2. 語意:自定義複合指派運算子更能表達『狀態更新』而非 『數學計算』。
目前適用的運算子
  1. 算術:+=, -=, *=, /=, %=
  2. 位元邏輯 :&=, ≠, ^=
  3. 位移運算 : <≤, >≥, >>>=
實作規則
  1. 必須是執行個體方法或是擴充成員 (extension members),目前舊式的 this 擴充方法不適用。
  2. 回傳值必須是 void
  3. 方法只能有一個參數
  4. 方法名稱是 operator += 以此類推。
執行個體方法實作

假設我們有一個基本的型別 MyClass,內部有個 int 型別的 Value 屬性,實作一個 MyClass += int 的方式如\下:

 public class MyClass
 {
     public int Value { get; set; }

     public void operator +=(int y)
     {
         Value += y;
     }    
 }

在外部可以這樣使用

 var a = new MyClass() { Value = 1 };
 a += 10;
 Console.WriteLine(a.Value);
extension member 實作

承上方的例子,使用 extension member 實作 -= 複合指派運算子:

 public static class MyClassExtensions
 {
     extension(MyClass obj)
     {
         public void operator -=(int y)
         {
             obj.Value -= y;
         }
     }
 }

雖然實際開發過程中除開基本型別以外用到這些運算子的機率不太高,尤其是自定義型別,但如果遇上了,不妨多利用這個新功能。