C# 程式設計/運算子
C# 運算子及其優先順序與 C 家族的其他語言中的運算子非常相似。
與 C++ 類似,類可以過載大多數運算子,在該運算子的第一個引數是該類例項的上下文中定義或重新定義運算子的行為,但這樣做通常為了清晰而被阻止。
以下是 C# 運算子的內建行為。
以下算術運算子作用於數值運算元(下面“表示式”中的 a 和 b)。
| 表示式 | 讀取 | 元數 | 解釋 |
|---|---|---|---|
a + b |
a 加 b |
二元 | + 返回其引數的 和。 |
a - b |
a 減 b |
二元 | - 返回其引數之間的 差。 |
a*b |
a 乘 b |
二元 | * 返回其引數的 乘積。 |
a/b |
a 除以 b |
二元 | / 返回其引數的 商。如果兩個運算元都是整數,則使用整數除法獲得該商(即它會丟棄任何結果餘數)。 |
a%b |
a 模 b |
二元 | % 僅對整數引數進行操作。它返回對這些引數進行整數除法的 餘數。(參見 模算術。) |
a++ |
a 加加 或 後自增 a |
一元 | ++ 僅對具有左值的引數進行操作。當放置在其引數之後時,它將該引數增加 1 並返回該引數在增加之前的值。 |
++a |
加加 a 或 前自增 a |
一元 | ++ 僅對具有左值的引數進行操作。當放置在其引數之前時,它將該引數增加 1 並返回結果值。 |
a-- |
a 減減 或 後自減 a |
一元 | -- 僅對具有左值的引數進行操作。當放置在其引數之後時,它將該引數減少 1 並返回該引數在減少之前的值。 |
--a |
減減 a 或 前自減 a |
一元 | -- 僅對具有左值的引數進行操作。當放置在其引數之前時,它將該引數減少 1 並返回結果值。 |
以下邏輯運算子作用於布林值或整型運算元,如所述。
| 表示式 | 讀取 | 元數 | 解釋 |
|---|---|---|---|
a&b |
a 按位與 b |
二元 | & 評估其兩個運算元並返回其結果的 邏輯合取 (“AND”)。如果運算元是整型,則按位執行邏輯合取。 |
a&&b |
a 與 b |
二元 | && 僅對布林值運算元進行操作。它評估其第一個運算元。如果結果為false,它返回false。否則,它評估並返回第二個運算元的結果。請注意,如果假設評估第二個運算元不會有任何副作用,則結果與 & 運算子執行的邏輯合取相同。這是一個 短路求值 的示例。 |
a | b |
a 按位或 b |
二元 | | 評估其兩個運算元並返回其結果的 邏輯析取 (“OR”)。如果運算元是整型,則按位執行邏輯析取。 |
a || b |
a 或 b |
二元 | || 僅對布林值運算元進行操作。它評估第一個運算元。如果結果為true,它返回true。否則,它評估並返回第二個運算元的結果。請注意,如果假設評估第二個運算元不會有任何副作用,則結果與 | 運算子執行的邏輯析取相同。這是一個 短路求值 的示例。 |
a ^ b |
a 異或 b |
二元 | ^ 返回其結果的 異或 (“XOR”)。如果運算元是整型,則按位執行異或。 |
!a |
非 a |
一元 | ! 僅對布林值運算元進行操作。它評估其運算元並返回結果的 否定 (“NOT”)。也就是說,如果 a 評估為false,它返回true;如果 a 評估為true,它返回false。 |
~a |
按位非 a |
一元 | ~ 僅對整型運算元進行操作。它評估其運算元並返回結果的按位否定。也就是說,~a 返回一個值,其中每個位都是評估 a 結果的相應位的否定。 |
| 表示式 | 讀取 | 元數 | 解釋 |
|---|---|---|---|
a << b |
a 左移 b |
二元 | << 運算其運算元並返回結果的第一個引數,左移由第二個引數指定的位數。它丟棄超出其第一個引數大小的移位的最高位,並將新的最低位設定為零。 |
a >> b |
a 右移 b |
二元 | >> 運算其運算元並返回結果的第一個引數,右移由第二個引數指定的位數。它丟棄移位超出其第一個引數大小的最低位,並將新的最高位設定為第一個引數的符號位,或者如果第一個引數是無符號的則設定為零。 |
二元關係運算符 ==, !=, <, >, <=, 和 >= 用於關係運算和型別比較。
| 表示式 | 讀取 | 元數 | 解釋 |
|---|---|---|---|
a == b |
a 等於 b |
二元 | 對於值型別的引數,== 運算子返回true,如果其運算元具有相同的值,否則返回false。對於字串型別,它返回true,如果字串的字元序列匹配。但是,對於其他引用型別(從 System.Object 派生的型別),a == b 僅在 a 和 b 引用同一個物件時返回true。 |
a != b |
a 不等於 b |
二元 | != 運算子返回 == 運算子的邏輯否定。因此,如果 a 不等於 b,它返回true,如果它們相等,它返回false。 |
a < b |
a 小於 b |
二元 | < 運算子對整型型別進行運算。如果 a 小於 b,它返回true,否則返回false。 |
a > b |
a 大於 b |
二元 | > 運算子對整型型別進行運算。如果 a 大於 b,它返回true,否則返回false。 |
a <= b |
a 小於或等於 b |
二元 | <= 運算子對整型型別進行運算。如果 a 小於或等於 b,它返回true,否則返回false。 |
a >= b |
a 大於或等於 b |
二元 | >= 運算子對整型型別進行運算。如果 a 大於或等於 b,它返回true,否則返回false。 |
最基本的是 = 運算子。不出所料,它將第二個引數的值(或引用)賦值給第一個引數。因此,賦值運算子是二元的,但具有 n 元形式。
(更準確地說,= 運算子要求其第一個(左)引數是一個可以為其賦值的表示式(一個l-value),而其第二個(右)引數是一個可以求值的表示式(一個r-value)。對左邊的可賦值表示式和右邊的繫結表示式要求是l-value 和 r-value 術語的來源。)
賦值運算子 (=) 的第一個引數通常是一個變數。當該引數具有值型別時,賦值操作會更改該引數的基礎值。當第一個引數是引用型別時,賦值操作會更改引用,因此第一個引數通常只是引用不同的物件,但它最初引用的物件不會更改(除非它可能不再被引用,並且因此可能成為垃圾回收的候選者)。
| 表示式 | 讀取 | 元數 | 解釋 |
|---|---|---|---|
a = b |
a 等於(或設定為)b |
二元 | = 運算子先計算其第二個引數,然後將結果賦值給(由其第一個引數指示的l-value)。 |
a = b = c |
b 設定為 c,然後 a 設定為 b |
n 元 | 等效於 a = (b = c)。當存在連續賦值時,最右邊的賦值首先計算,從右到左進行。在本例中,a 和 b 兩個變數的值都為 c。這可以無限期地繼續,將相同的r-value 賦值給多個l-value(例如,a = b = c = d = 0; 等效於 a = 0; b = 0; c = 0; d = 0;)。 |
簡寫賦值運算子將 a = a operator b 的常見賦值操作縮短為 a operator= b,從而減少了輸入量並使語法更簡潔。
| 表示式 | 讀取 | 元數 | 解釋 |
|---|---|---|---|
a += b |
a 加等於(或增加)b |
二元 | 等效於 a = a + b。 |
a -= b |
a 減等於(或減少)b |
二元 | 等效於 a = a - b。 |
a *= b |
a 乘等於(或乘以)b |
二元 | 等效於 a = a*b。 |
a /= b |
a 除等於(或除以)b |
二元 | 等效於 a = a/b。 |
a %= b |
a 取模等於 b |
二元 | 等效於 a = a%b。 |
a &= b |
a 與等於 b |
二元 | 等效於 a = a&b。 |
a |= b |
a 或等於 b |
二元 | 等效於 a = a|b。 |
a ^= b |
a 異或等於 b |
二元 | 等效於 a = a^b。 |
a <<= b |
a 左移賦值 b |
二元 | 等效於 a = a << b。 |
a >>= b |
a 右移賦值 b |
二元 | 等效於 a = a >> b。 |
型別資訊
[edit | edit source]| 表示式 | 讀取 | 元數 | 解釋 |
|---|---|---|---|
x is T |
判斷 x 是否型別 T |
二元 | 如果基類型別的變數 x 儲存了派生類型別 T 的物件,或者 x 是型別 T,則返回 true;否則返回 false。 |
x as T |
將 x 強制轉換為 T |
二元 | 如果基類型別的變數 x 儲存了派生類型別 T 的物件,或者 x 是型別 T,則返回 (T)x (x 強制轉換為 T);否則返回 null。等效於 x is T ? (T)x : null |
sizeof(x) |
大小 x |
一元 | 返回值型別 x 的大小。備註:sizeof 運算子只能應用於值型別,不能應用於引用型別。 |
typeof(T) |
型別 T |
一元 | 返回一個 System.Type 物件,描述該型別。 T 必須是型別的名稱,而不是變數。使用 GetType 方法來檢索變數的執行時型別資訊。 |
指標操作
[edit | edit source]注意:大多數 C# 開發人員一致認為,在 C# 中不建議直接操作和使用指標。該語言有許多內建類,可以讓你執行幾乎任何操作。C# 是為記憶體管理而構建的,指標的建立和使用極大地破壞了這一目的。這指的是指標的宣告以及指標表示法的使用,而不是陣列。實際上,只有在“不安全模式”下編譯程式,才能使用指標。
| 表示式 | 讀取 | 元數 | 解釋 |
|---|---|---|---|
*a |
指向 a 的物件 |
一元 | 間接定址 運算子。允許訪問被指向的物件。 |
a->member |
成員 member 屬於 a |
二元 | 類似於 . 運算子。允許訪問被指向的類和結構體的成員。 |
a[b] |
指向 a 的偏移量 b 處的物件 |
二元 | 用於索引指標。 |
&a |
指向 a 的引用 |
一元 | 引用指標的地址。 |
stackalloc a |
在棧上 a |
二元 | 在棧上分配記憶體,而不是在堆上。參見 C Sharp Programming/Keywords/stackalloc。 |
fixed a |
阻止 a 被重新分配 |
二元 | 暫時固定一個變數,以便可以找到它的地址。參見 C Sharp Programming/Keywords/fixed。 |
溢位異常控制
[edit | edit source]| 表示式 | 讀取 | 元數 | 解釋 |
|---|---|---|---|
checked(a) |
計算 a 並檢查溢位 |
一元 | 對值 a 使用溢位檢查。參見 C Sharp Programming/Keywords/checked。 |
unchecked(a) |
計算 a 而不檢查溢位 |
一元 | 避免對值 a 進行溢位檢查。參見 C Sharp Programming/Keywords/unchecked。 |
其他
[edit | edit source]| 表示式 | 讀取 | 元數 | 解釋 |
|---|---|---|---|
a.b |
成員 b 屬於 a |
二元 | 訪問型別或名稱空間 a 的成員 b。如果 b 是一個欄位,它將呼叫該欄位的 get 函式。 |
a[b] |
項 b 位於 a 中 |
二元 | 返回 a 中索引 b 的值。陣列使用 0 起始索引。 |
(a)b |
將 b 強制轉換為型別 a |
二元 | 顯式地將值 b 強制轉換為型別 a。型別 b 必須有一個強制轉換函式,可以將它直接強制轉換為 a 或另一個具有強制轉換函式的型別,該函式可以強制轉換為 a。 |
new a |
建立一個新的 a |
n 元 | 建立一個型別為 a 的物件並呼叫它的預設建構函式。型別 a 可能包含帶有引數的建構函式,在這種情況下,它將採用以下形式 new a(type1 arg1, type2 arg2, ...)。參見 C Sharp Programming/Keywords/new。 |
a + b |
將字串 b 連線到字串 a 的末尾 |
二元 | 如果 a 和 b 是字串,則將 a 和 b 連線起來。如果任何一個被加數是 null,則使用空字串 ("") 代替。如果一個被加數是字串,而另一個是非字串物件,則在連線之前,將對該物件呼叫 ToString()。 |
a + b |
將委託 b 連線到委託 a |
二元 | 如果 a 和 b 是委託,則執行委託連線。 |
a ? b : c |
如果 a 則 b 否則 c |
三元運算子 | 如果 a 為真,則計算並返回 b 的值,否則計算並返回 c 的值。 b 和 c 中只有一個會被計算。 |
a ?? b |
如果 a 是 null 則 b 否則 a |
二元 | 如果 a 為 null,則計算並返回 b 的值,否則計算並返回 a 的值。 如果 a 不為 null,則不會計算 b。 |
a?.b |
如果 a 不為 null 則計算 b |
二元 | 這在嘗試引用成員欄位或方法之前判斷物件是否為 null。 三元運算子與 ?? 結合使用以提供備選方案(例如 a?.b()??c)。 可以與 ?[] 結合使用,以實現 n 元形式,並進行連續的空值檢查(例如,a?.b()?[c])。 (從 C# 6 開始可用) |
a?[b] |
如果 a 不為 null 則獲取 b |
二元 | 這在嘗試引用專案(數字或識別符號)之前判斷陣列或其他結構是否為 null。 三元運算子與 ?? 結合使用以提供備選方案(例如 a?[b]??c)。 可以與 ?. 結合使用,以實現 n 元形式,並進行連續的空值檢查(例如,a?.b()?[c])。 (從 C# 6 開始可用) |
@"a" |
逐字 "a" |
零元 | 逐字文字的字串常量,即忽略跳脫字元。 |
$"{b}" |
將 b 插入字串字面量中 |
n 元 | $ 開始字串插值語句,該語句將子字串插入到字串字面量中,這對於快速構建字串非常有用。 {} 中包含的符號名稱將被計算為字串值,必要時使用 ToString()。 (從 C# 6 開始可用) |
$@"{b}" |
將 b 插入逐字字串字面量中 |
n 元 | 結合了 @ 和 $ 的功能。 大括號字面量可以使用 {{ 和 }} 指定 (從 C# 6 開始可用。注意:在 C# 8 及更高版本中,運算子的順序可以互換。) |