C# 提供了許多運算符,這些運算符是指定要在表達式中執行哪些操作(數學、索引、函數調用等等)的符号。 可以重載許多應用于使用者定義類型的運算符,進而更改其含義。
對整數類型執行的運算(如
==
、
!=
、
<
、
>
、
&
、
|
)通常也可對枚舉 (
enum
) 類型執行。
以下章節按最高優先級到最低優先級的順序列示 C# 運算符。 各章節内運算符的優先級相同。
主要運算符
以下是具有最高優先級的運算符。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。
x.y:成員通路。
x?.y:null 條件成員通路。 如果左操作數為
null
,則傳回
null
。
x?[y]:null 條件索引通路。 如果左操作數為
null
,則傳回
null
。
f(x):函數調用。
a[x]:聚合對象索引。
x++:字尾遞增。 先傳回 x 值,然後用加 1(通常加整數 1)後的 x 值更新存儲位置。
x--:字尾遞減。 先傳回 x 值,然後用減 1(通常減整數 1)後的 x 值更新存儲位置。
new:類型執行個體化。
typeof:傳回表示操作數的 System.Type 對象。
checked:對整數運算啟用溢出檢查。
unchecked:對整數運算禁用溢出檢查。 這是預設的編譯器行為。
default(T):傳回類型 T 的預設初始值,引用類型的預設初始值為
null
,數值類型的預設初始值為 0,結構類型成員的預設初始填充值為 0/
null
。
delegate:聲明并傳回委托執行個體。
sizeof:傳回類型操作數的大小(以位元組為機關)。
->:指針取消引用與成員通路相結合。
一進制運算符
這些運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。
+x:傳回 x 的值。
-x:數值取反。
!x:邏輯取反。
~x:按位求補。
++x:字首遞增。 先用加 1(通常加整數 1)後的 x 值更新存儲位置,然後傳回 x 值。
--x:字首遞減。 先用減 1(通常減整數 1)後的 x 值更新存儲位置,然後傳回 x 值。
(T)x:類型顯式轉換。
await:等待
Task
。
&x:位址。
*x:取消引用。
乘法運算符
這些運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。
x * y:乘法。
x / y:除法。 如果操作數均為整數,則結果為整數,舍去小數(例如,
-7 / 2 is -3
)。
x % y:取模。 如果操作數均為整數,則傳回 x 除以 y 後的餘數。 如果
q = x / y
且
r = x % y
,則
x = q * y + r
。
相加運算符
這些運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。
x + y:加法。
x:y:減法。
移位運算符
這些運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。
x << y:左移位,右側用 0 填充。
x >> y:右移位。 如果左操作數是
int
或
long
,則左位數補符号位。 如果左操作數是
uint
或
ulong
,則左位數補零。
關系和類型測試運算符
這些運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。
x < y:小于(如果 x 小于 y,則為 true)。
x > y:大于(如果 x 大于 y,則為 true)。
x <= y:小于或等于。
x >= y:大于或等于。
is:類型相容性。 如果求值後的左操作數可以轉換為右操作數中指定的類型(靜态類型),則傳回 true。
as:類型轉換。 傳回左操作數并轉換為右操作數中指定的類型(靜态類型),但
as
傳回
null
,其中
(T)x
會引發異常。
相等運算符
這些運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。
x == y:相等。 預設情況下,對于
string
以外的引用類型,此運算符傳回引用相等(辨別測試)。 但是,類型可以重載
==
,是以,如果你想測試辨別,最好對
object
使用
ReferenceEquals
方法。
x != y:不相等。 請參閱有關
==
的注釋。 如果某個類型重載
==
,則它必須重載
!=
。
邏輯 AND 運算符
此運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊該運算符轉到包含示例的詳細頁面。
x & y:邏輯或位 AND。 與整數類型一起使用,并且通常允許
enum
類型。
邏輯 XOR 運算符
此運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊該運算符轉到包含示例的詳細頁面。
x ^ y:邏輯或位 XOR。 通常可以将此運算符與整數類型和
enum
類型一起使用。
邏輯 OR 運算符
此運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊該運算符轉到包含示例的詳細頁面。
x | y:邏輯或位 OR。 與整數類型一起使用,并且通常允許
enum
類型。
條件 AND 運算符
此運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊該運算符轉到包含示例的詳細頁面。
x && y:邏輯 AND。 如果第一個操作數為 false,則 C# 不對第二個操作數求值。
條件 OR 運算符
此運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊該運算符轉到包含示例的詳細頁面。
x || y:邏輯 OR。 如果第一個操作數為 true,則 C# 不對第二個操作數求值。
Null 合并運算符
此運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊該運算符轉到包含示例的詳細頁面。
x ?? y:如果不為
null
,則傳回
x
;否則傳回
y
。
條件運算符
此運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊該運算符轉到包含示例的詳細頁面。
t ? x : y:如果測試
t
為 true,則計算并傳回
x
;否則,計算并傳回
y
。
指派和 Lambda 運算符
這些運算符的優先級比下一章節高,比上一章節低。 請注意,你可以單擊運算符轉到包含示例的詳細頁面。
x = y:指派。
x += y:遞增。
x
值加
y
值,結果存儲在
x
中,并傳回新值。 如果
x
指定
event
,則
y
必須是 C# 作為事件處理程式添加的相應函數。
x -= y:遞減。
x
值減
y
值,結果存儲在
x
中,并傳回新值。 如果
x
指定
event
,則
y
必須是 C# 作為事件處理程式删除的相應函數
x *= y:乘法指派。
x
值乘以
y
值,結果存儲在
x
中,并傳回新值。
x /= y:除法指派。
x
值除以
y
值,結果存儲在
x
中,并傳回新值。
x %= y:取模指派。
x
值除以
y
值,餘數存儲在
x
中,并傳回新值。
x &= y:AND 指派。
y
值和
x
值相與,結果存儲在
x
中,并傳回新值。
x |= y:OR 指派。
y
值和
x
值相或,結果存儲在
x
中,并傳回新值。
x ^= y:XOR 指派。
y
值和
x
值相異或,結果存儲在
x
中,并傳回新值。
x <<= y:左移指派。 将
x
值向左移動
y
位,結果存儲在
x
中,并傳回新值。
x >>= y:右移指派。 将
x
值向右移動
y
位,結果存儲在
x
中,并傳回新值。
=>:lambda 聲明。
算術溢出
算術運算符(+、-、*、/)的計算結果可能會超出所涉數值類型的可取值範圍。 詳細資訊應參考特定運算符的相關章節,而一般情況下:
-
整數算術溢出或者引發 OverflowException,或者放棄結果的最高有效位。 整數被零除總是引發 @System.DivideByZeroException。
發生整數溢出時,具體影響視執行上下文而定,上下文可為 checked 或 unchecked。 在 checked 上下文中引發 OverflowException。 在 unchecked 上下文中,放棄結果的最高有效位并繼續執行。 是以,C# 讓你有機會選擇處理或忽略溢出。 預設情況下,算術運算發生在 unchecked 上下文中。
除算術運算以外,整型類型之間的顯式轉換也會導緻溢出(例如,将 long 顯式轉換成 int),并受到 checked 或 unchecked 執行的限制。 但是,位運算符和移位運算符永遠不會導緻溢出。
- 浮點算術溢出或被零除從不引發異常,因為浮點類型基于 IEEE 754,是以可以表示無窮大和 NaN(非數值)。
- 小數算術溢出總是引發 OverflowException。 小數被零除總是引發 DivideByZeroException。