表達式是在操作數和運算符的基礎之上構造而成。?表達式的運算符指明了向操作數應用的運算。?運算符的示例包括?+
、-
、*
、/
?和?new
。?操作數的示例包括文本、字段、局部變量和表達式。
如果表達式包含多個運算符,那么運算符的優先級決定了各個運算符的計算順序。?例如,表達式?x + y * z
?相當于計算?x + (y * z)
,因為?*
?運算符的優先級高于?+
?運算符。
如果操作數兩邊的兩個運算符的優先級相同,那么運算符的結合性決定了運算的執行順序:
- 除了賦值運算符之外,所有二元運算符均為左結合運算符,即從左向右執行運算。?例如,
x + y + z
?將計算為?(x + y) + z
。 - 賦值運算符和條件運算符 (
?:
) 為右結合運算符,即從右向左執行運算。?例如,x = y = z
?將計算為?x = (y = z)
。
可以使用括號控制優先級和結合性。?例如,x + y * z
?先計算?y
?乘?z
,并將結果與?x
?相加,而?(x + y) * z
?則先計算?x
?加?y
,然后將結果與?z
?相乘。
大多數運算符都可以重載。?借助運算符重載,可以為一個或兩個操作數為用戶定義類或結構類型的運算指定用戶定義運算符實現代碼。
下面總結了 C# 運算符,按優先級從高到低的順序列出了各類運算符。?同一類別的運算符的優先級也相同。?每個類別下均列出了相應類別的表達式,以及對每種表達式類型的說明。
- 基本
x.m
:成員訪問x(...)
:方法和委托調用x[...]
:數組和索引器訪問x++
:后置遞增x--
:后置遞減new T(...)
:創建對象和委托new T(...){...}
:使用初始值設定項的對象創建new {...}
:匿名對象初始值設定項new T[...]
:數組創建typeof(T)
:獲取?T
?的?Type?對象checked(x)
:在已檢查的上下文中計算表達式unchecked(x)
:在未檢查的上下文中計算表達式default(T)
:獲取類型為?T
?的默認值delegate {...}
:匿名函數(匿名方法)
- 一元
+x
:標識-x
:取反!x
:邏輯取反~x
:按位取反++x
:前置遞增--x
:前置遞減(T)x
:將?x
?顯式轉換成類型?T
await x
:異步等待?x
?完成
- 乘法
x * y
:乘法x / y
:除法x % y
:求余
- 加法
x + y
:加法、字符串串聯、委托組合x – y
:減法、委托刪除
- Shift
x << y
:左移位x >> y
:右移位
- 關系和類型測試
x < y
:小于x > y
:大于x <= y
:小于或等于x >= y
:大于或等于x is T
:如果?x
?是?T
,返回?true
;否則,返回?false
x as T
:返回類型為?T
?的?x
;如果?x
?的類型不是?T
,返回?null
- 相等
x == y
:等于x != y
:不等于
- 邏輯“與”
x & y
:整數型位AND,布爾型邏輯 AND
- 邏輯 XOR
x ^ y
:整數型位 XOR,布爾型邏輯 XOR
- 邏輯“或”
x | y
:整數型位 OR,布爾型邏輯 OR
- 條件“與”
x && y
:僅當?x
?不是?false
?時,才計算?y
- 條件“或”
x || y
:僅當?x
?不是?true
?時,才計算?y
- null 合并
x ?? y
:如果?x
?為 null,計算結果為?y
;否則,計算結果為?x
- 條件運算
x ? y : z
:如果?x
?為?true
,計算?y
;如果?x
?為?false
,計算?z
- 賦值或匿名函數
x = y
:賦值x op= y
:復合賦值;支持以下運算符*=
?/=
?%=
?+=
?-=
?<<=
?>>=
?&=
?^=
?|=
(T x) => y
:匿名函數(lambda 表達式)