C# 提供一些運算符。 其中許多都受到 內建型 別的支援,並可讓您使用這些類型的值來執行基本作業。 這些運算子包括下列群組:
一般而言,您可以 多載 這些運算元,也就是指定使用者定義型別作數的運算符行為。
最簡單的 C# 運算式是常值(例如 整數 和 實 數)和變數的名稱。 您可以使用運算子將它們合併成複雜的運算式。 運算符 優先順序 和 關聯性 會決定執行表達式中作業的順序。 您可以使用括號來變更運算符優先順序和關聯性所強加的評估順序。
在下列程式代碼中,表達式的範例位於指派右側:
int a, b, c;
a = 7;
b = a;
c = b++;
b = a + b * c;
c = a >= 100 ? b : c / 10;
a = (int)Math.Sqrt(b * b + c * c);
string s = "String literal";
char l = s[s.Length - 1];
List<int> numbers = [..collection];
b = numbers.FindLast(n => n > 1);
一般而言,表達式會產生結果,而且可以包含在另一個表達式中。
void方法呼叫是不會產生結果的表達式範例。 它只能當做 語句使用,如下列範例所示:
Console.WriteLine("Hello, world!");
以下是 C# 提供的其他類型的運算式:
插入字串表示式 ,可提供方便的語法來建立格式化字串:
var r = 2.3; var message = $"The area of a circle with radius {r} is {Math.PI * r * r:F3}."; Console.WriteLine(message); // Output: // The area of a circle with radius 2.3 is 16.619.可讓您建立匿名函式的 Lambda 運算式:
int[] numbers = { 2, 3, 4, 5 }; var maximumSquare = numbers.Max(x => x * x); Console.WriteLine(maximumSquare); // Output: // 25可讓您直接在 C# 中使用查詢功能的查詢表示式:
int[] scores = { 90, 97, 78, 68, 85 }; IEnumerable<int> highScoresQuery = from score in scores where score > 80 orderby score descending select score; Console.WriteLine(string.Join(" ", highScoresQuery)); // Output: // 97 90 85
您可以使用 表達式主體定義 ,為方法、建構函式、屬性、索引器或完成項提供簡潔的定義。
運算元優先順序
在具有多個運算子的表達式中,會先評估優先順序較高的運算符,再評估優先順序較低的運算符。 在下列範例中,會先執行乘法,因為它的優先順序高於加法:
var a = 2 + 2 * 2;
Console.WriteLine(a); // output: 6
使用括號來變更運算元優先順序所強加的評估順序:
var a = (2 + 2) * 2;
Console.WriteLine(a); // output: 8
下表列出從最高優先順序到最低優先順序的 C# 運算符。 每個數據列內的運算子具有相同的優先順序。
| 運營商 | 類別或名稱 |
|---|---|
x.y, f(x), a[i], , , x?.yx?[y]x++, x-- , x!, new, typeof, checked, unchecked, default, nameof, delegate, sizeof, stackalloc, x-y> |
主要 |
| +x、 -x、 !x、 ~x、 ++x、 -x、 ^x、 (T)x、 await、 &x、 *x、 true 和 false | 單一運算 |
| x..y | 範圍 |
| switch, with |
switch 和 with 表達式 |
| x * y、 x / y、 x % y | 乘法 |
| x + y、 x – y | 添加劑 |
| x << y、 x >> y、 x >>> y | 轉變 |
| x < y、 x > y、 x <= y、 x >= y、 is、 as | 關係型和類型測試 |
| x == y,x!= y | 平等 |
x & y |
布爾邏輯 AND 或 位邏輯 AND |
x ^ y |
布爾邏輯 XOR 或 位邏輯 XOR |
x | y |
布爾邏輯 OR 或 位邏輯 OR |
| x & y | 條件式 AND |
| x ||y | 條件式 OR |
| x ?? y | Null 聯合運算符 |
| c ? t : f | 條件運算元 |
| x = y, x += y, x -= y, x *= y, x /= y, x %= y, x &= y, x |= y, x ^<<>>= y, x = y, x >>>??= y、=> | 指派和 Lambda 宣告 |
如需邏輯模式組合子優先順序的相關信息,請參閱 Patterns 一文的邏輯模式檢查優先順序和順序一節。
運算元關聯性
當運算子具有相同優先順序時,運算子的關聯性會決定執行作業的順序:
-
左關聯 運算子會依左至右的順序進行評估。 除了 指派運算子 和 Null 聯合運算子之外,所有二元運算子都是左關聯運算符。 例如,
a + b - c會評估為(a + b) - c。 -
右關聯 運算子會依從右至左的順序進行評估。 指派運算子、Null 聯合運算元、Lambda 和 條件運算子
?:都是右關聯。 例如,x = y = z會評估為x = (y = z)。
這很重要
在 表單 P?.A0?.A1的運算式中,如果 P 為 null,則不會 A0 評估 或 A1 。 同樣地,在表單 P?.A0.A1的運算式中,因為 A0 當 為 null 時 P 不會評估,兩者都不是 A0.A1。 如需詳細資訊,請參閱 C# 語言規格 。
使用括弧來變更運算符關聯性所強加的評估順序:
int a = 13 / 5 / 2;
int b = 13 / (5 / 2);
Console.WriteLine($"a = {a}, b = {b}"); // output: a = 1, b = 6
作數評估
與運算符優先順序和關聯性無關,表達式中的作數會從左至右進行評估。 下列範例示範運算符和作數的評估順序:
| 表現 | 評估順序 |
|---|---|
a + b |
a、b、+ |
a + b * c |
a, b, c, *, + |
a / b + c * d |
a, b, /, c, d, *, + |
a / (b + c) * d |
a, b, c, +, /, d, * |
一般而言,會評估所有運算符作數。 不過,某些運算子會有條件地評估作數。 也就是說,這類運算子最左邊作數的值會定義是否應該評估其他作數。 這些運算子是條件式邏輯 AND () 和 OR||(&&) 運算子、Null 聯合運算子和 ??=、Null 條件運算子??和 ?[],以及條件運算子 ?.?:。 如需詳細資訊,請參閱每個運算子的描述。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格的下列幾節: