C# 的運算子與運算式系統繼承自 C/C++ 並針對型別安全、元件導向與現代語言特性進行深度重設計。本文提供全景式總覽,涵蓋分類體系、優先級規則、求值策略與核心設計哲學,為深入掌握各運算子奠定基礎。
+, ==, new, typeof, await)| 分類 | 運算元數 | 代表運算子 | 特徵 |
|---|---|---|---|
| 一元運算子 | 1 | +, -, !, ~, ++, --, (T), typeof, sizeof, await, nameof, default | 前綴/後綴區別 |
| 二元運算子 | 2 | +, -, *, /, %, &&, ||, &, |, ^, ==, !=, <, >, is, as, ??, + (字串/委派) | 中置語法 |
| 三元運算子 | 3 | ?: (條件運算子) | 唯一三元、右結合 |
| 特殊運算子 | N/A | new, typeof, sizeof, checked, unchecked, default, nameof, stackalloc, -> (Lambda), => (運算式主體) | 關鍵字形式、語法糖 |
x.y, f(x), a[x], x++, x--, new, typeof, sizeof, checked, unchecked, default+, -, !, ~, ++x, --x, (T)x*, /, %+, -<<, >><, >, <=, >=, is, as==, !=&^|&& (短路)|| (短路)?:=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |==>, from, where, select...1. 主要運算子 : x.y f(x) a[x] x++ x-- new typeof sizeof checked unchecked default 2. 一元運算子 : + - ! ~ ++x --x (T)x 3. 乘法性運算子 : * / % 4. 加法性運算子 : + - 5. 移位運算子 : << >> 6. 關係運算子 : < > <= >= is as 7. 等值運算子 : == != 8. 邏輯 AND (位元) : & 9. 邏輯 XOR (位元) : ^ 10. 邏輯 OR (位元) : | 11. 條件 AND (短路) : && 12. 條件 OR (短路) : || 13. 條件運算子 : ?: 14. 指派運算子 : = *= /= %= += -= <<= >>= &= ^= |=
a + b + c → (a + b) + ca = b = c → a = (b = c))、條件運算子 (a ? b : c ? d : e → a ? b : (c ? d : e))a < b < c 編譯錯誤,需 a < b && b < c)C# 標準規定:運算元與引數按書寫順序由左至右評估,與運算子優先級無關。
static int F(string s) { Console.Write(s); return 1; }
int x = F("A") + F("B") * F("C");
// 輸出順序:A B C
// 計算順序:1 + (1 * 1) = 2
// 副作用順序:A→B→C (左至右)
await 等待點順序public readonly struct Rational
{
public int Num, Den;
public static Rational operator +(Rational a, Rational b)
=> new Rational { Num = a.Num * b.Den + b.Num * a.Den, Den = a.Den * b.Den };
public static bool operator ==(Rational a, Rational b)
=> a.Num * b.Den == b.Num * a.Den;
public static bool operator !=(Rational a, Rational b) => !(a == b);
// 必須成對多載:==/!=, >/<=/>=
public static bool operator <(Rational a, Rational b)
=> a.Num * b.Den < b.Num * a.Den;
// ... 其他比較運算子
}
public readonly struct Celsius
{
public double Value;
public static implicit operator double(Celsius c) => c.Value;
public static explicit operator Celsius(double d) => new Celsius { Value = d };
}
public readonly struct Optional{ public bool HasValue { get; } public static bool operator true(Optional o) => o.HasValue; public static bool operator false(Optional o) => !o.HasValue; public static Optional operator &(Optional a, Optional b) => a.HasValue ? b : a; // 短路 AND }
| 版本 | 新增運算子/特性 | 影響 |
|---|---|---|
| C# 2.0 | ?? (null 合併), ?: 可為 null 型別 | Null 安全模式 |
| C# 3.0 | Lambda =>, 擴充方法, LINQ 查詢運算子 | 函數式風格、資料查詢 |
| C# 6.0 | nameof, ?. (null 條件), ??=, 字串插值 $"" | 防禦性程式設計、可讀性 |
| C# 7.0 | 模式比對 is, switch, 元組解構, ref 回傳 | 型別驅動邏輯、解構 |
| C# 8.0 | switch 運算式, ?. 索引子, 非同步串流 | 運算式導向、模式完整 |
| C# 9.0 | not, and, or 模式, with 運算式 (record) | 模式邏輯組合、不可變更新 |
| C# 10.0 | 插值字串處理器, global using, record struct | 字串效能、結構記錄 |
| C# 11.0 | List 模式, required 成員, 原始字串常值 | 集合模式、建構安全 |
| C# 12.0 | 主建構函式, 集合運算式 [], ref readonly 參數 | 簡潔建構、集合字面值 |
int → short 需顯式)is/as 取代不安全轉型switch 運算式、Lambda、模式比對&&/||/??) — 防禦性程式設計核心is/switch) — 現代條件邏輯主流C# 的運算子系統不只是語法糖,更是型別安全、效能可預測與領域表達力的核心基礎設施。系統性掌握它,是成為資深 C# 開發者的必經之路。