表达式是在操作数和运算符的基础之上构造而成。 表达式的运算符指明了向操作数应用的运算。 运算符的示例包括 +
、-
、*
、/
和 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 表达式)
-