運算子為 C# 定義類別實例間運算式操作的成員。類似索引器,運算子仍為方法實現的邏輯介面抽象,編譯為 IL 時仍以方法形式呼叫。類別內定義運算子成員稱「運算子多載」。C# 可多載運算子三類:
| 類別 | 可多載運算子 |
|---|---|
| 一元運算子 | + - ! ~ ++ -- true false |
| 二元運算子 | + - * / % & | ^ << >> == != > < >= <= |
| 轉換運算子 | 隱式轉換 implicit、顯式轉換 explicit |
public 和 static 修飾,否則編譯錯誤。virtual/sealed/override/abstract。using System;
class Complex
{
double r, v; // r + v i
public Complex(double r, double v) { this.r = r; this.v = v; }
public static Complex operator +(Complex a, Complex b)
{ return new Complex(a.r + b.r, a.v + b.v); }
public static Complex operator -(Complex a)
{ return new Complex(-a.r, -a.v); }
public static Complex operator ++(Complex a)
{ return new Complex(a.r + 1, a.v + 1); }
public void Print() { Console.Write(r + " + " + v + "i"); }
}
class Test
{
public static void Main()
{
Complex a = new Complex(3, 4);
Complex b = new Complex(5, 6);
Complex c = -a; c.Print(); // -3 + -4i
Complex d = a + b; d.Print(); // 8 + 10i
a.Print(); // 3 + 4i
Complex e = a++; a.Print(); e.Print(); // 4 + 5i / 3 + 4i
Complex f = ++a; a.Print(); f.Print(); // 5 + 6i / 5 + 6i
}
}
輸出:-3 + -4i 8 + 10i 3 + 4i 4 + 5i 3 + 4i 5 + 6i 5 + 6i
+ 二元運算子、- 一元運算子(取負)、++ 一元運算子。new 新物件(true/false 運算子除外)。++/-- 特別重要:a++ 時捨棄原 a,以新 new 物件取代!e = a++ 或 f = ++a 中 e/f 值與多載運算子回傳值無關!僅為前置/後置情況下取得 a 舊值或新值。++/-- 回傳型別與參數型別必須同聲明類別。+ - ! ~ 參數型別必須同聲明類別,回傳型別可任意。true/false 參數型別必須同聲明類別,回傳型別必為 bool,且必須成對出現(單獨宣告編譯錯誤)。