C# 操作符及其优先级

C# 中的操作符及其优先级与 C 语言家族的其他语言(如 C++)非常相似。类似于 C++,C# 的类可以重载大多数操作符,从而定义或重新定义操作符在特定上下文(如操作符的第一个参数是该类的实例)中的行为。然而,为了代码清晰,通常不建议过多使用操作符重载。

操作符可以根据其元数(参数数量)分为:无参(nullary)、单参(unary)、双参(binary)、三参(ternary)和多参(n-ary)。

以下是 C# 中内置操作符的行为。


算术操作符

以下算术操作符用于数字操作数(表达式中的参数 ab):

表达式 读法 元数 说明
a + b a plus b 二元 + 返回两个参数的和。
a - b a minus b 二元 - 返回两个参数的差值。
a * b a times b 二元 * 返回两个参数的乘积。
a / b a divided by b 二元 / 返回两个参数的商。如果两个参数都是整数,则执行整数除法(丢弃余数)。
a % b a mod b 二元 % 仅用于整数,返回整数除法的余数。
a++ a plus plus 单元 后置自增,a++a 增加 1,返回递增前的值。
++a plus plus a 单元 前置自增,++aa 增加 1,返回递增后的值。
a-- a minus minus 单元 后置自减,a--a 减少 1,返回递减前的值。
--a minus minus a 单元 前置自减,--aa 减少 1,返回递减后的值。

逻辑操作符

以下逻辑操作符用于布尔或整数操作数:

表达式 读法 元数 说明
a & b a bitwise and b 二元 对操作数逐位求与。布尔操作数则返回逻辑与。
a && b a and b 二元 对布尔操作数,短路求与:若第一个操作数为 false,直接返回 false
`a b` a bitwise or b 二元
`a   b` a or b
a ^ b a x-or b 二元 对操作数逐位异或(XOR)。
!a not a 单元 返回布尔操作数的逻辑非。
~a bitwise not a 单元 返回整数操作数的逐位取反。

位移操作符

表达式 读法 元数 说明
a << b a left shift b 二元 a 左移 b 位,丢弃高位,低位补零。
a >> b a right shift b 二元 a 右移 b 位,丢弃低位,高位补符号位(有符号数)或补零(无符号数)。

关系操作符

以下操作符用于关系运算和类型比较:

表达式 读法 元数 说明
a == b a is equal to b 二元 对值类型,若操作数值相等返回 true;对字符串类型,若字符序列匹配返回 true;对引用类型,若引用相同返回 true
a != b a is not equal to b 二元 返回 a == b 的逻辑非。
a < b a is less than b 二元 a 小于 b,返回 true
a > b a is greater than b 二元 a 大于 b,返回 true
a <= b a is less than or equal to b 二元 a 小于等于 b,返回 true
a >= b a is greater than or equal to b 二元 a 大于等于 b,返回 true

赋值操作符

最基本的赋值操作符是 =,它将第二个参数的值(或引用)赋给第一个参数。因此,赋值操作符是二元的,但也可以形成多元形式。

技术上讲,= 操作符的第一个参数(左侧)必须是一个可以被赋值的表达式(l-value),而第二个参数(右侧)必须是一个可求值的表达式(r-value)。左侧需要是可赋值的表达式,而右侧需要是已绑定的表达式,这是术语 "l-value" 和 "r-value" 的起源。

  • 值类型:赋值操作会更改变量的底层值。
  • 引用类型:赋值操作会更改引用,使变量指向另一个对象,但原引用指向的对象不会改变(除非被垃圾回收)。

表达式与说明

表达式 读法 元数 说明
a = b a equals (or set to) b 二元 = 计算右侧表达式并将结果赋值给左侧的变量。
a = b = c b set to c, and then a set to b 多元 相当于 a = (b = c),右侧赋值先执行。例如 a = b = c = 0; 等价于 a = 0; b = 0; c = 0;

简写赋值操作符

简写赋值操作符将常见的赋值操作缩写为更简洁的语法,例如将 a = a + b 简写为 a += b

表达式 读法 元数 说明
a += b a plus equals b 二元 等价于 a = a + b
a -= b a minus equals b 二元 等价于 a = a - b
a *= b a multiply equals b 二元 等价于 a = a * b
a /= b a divide equals b 二元 等价于 a = a / b
a %= b a mod equals b 二元 等价于 a = a % b
a &= b a and equals b 二元 等价于 a = a & b
`a = b` a or equals b 二元
a ^= b a xor equals b 二元 等价于 a = a ^ b
a <<= b a left-shift equals b 二元 等价于 a = a << b
a >>= b a right-shift equals b 二元 等价于 a = a >> b

类型信息操作符

表达式 读法 元数 说明
x is T is x of type T 二元 如果 x 是类型 T 的实例,返回 true;否则返回 false
x as T cast x to T 二元 如果 x 是类型 T 的实例,则返回 (T)x,否则返回 null
sizeof(x) size of x 单元 返回值类型 x 的大小(仅适用于值类型,不适用于引用类型)。
typeof(T) type of T 单元 返回描述类型 TSystem.Type 对象。

指针操作(不推荐)

大多数 C# 开发者认为直接使用指针不是最佳实践。C# 提供了内置的内存管理机制,直接使用指针会破坏这些机制。使用指针的代码必须在 "unsafe mode" 下编译。

表达式 读法 元数 说明
*a object at a 单元 间接访问操作符,允许访问指针所指的对象。
a->member member of a 二元 类似 . 操作符,用于访问指针指向的类或结构体的成员。
a[b] object at offset b from a 二元 用于索引指针。
&a reference to a 单元 返回 a 的地址。
stackalloc a allocate a on the stack 二元 在堆栈上分配内存,而不是堆上。
fixed a prevent a from being relocated 二元 暂时固定一个变量的位置以获取其地址。

溢出控制

表达式 读法 元数 说明
checked(a) evaluate a and check for overflow 单元 检查表达式 a 是否发生溢出。
unchecked(a) evaluate a without checking for overflow 单元 忽略 a 是否发生溢出,继续计算。

其他操作符

表达式 读法 元数 说明
a.b member b of a 二元 访问 a 的成员 b(字段、方法等)。
a[b] item b in a 二元 获取数组或集合 a 中索引为 b 的项。
(a)b cast b to type a 二元 b 显式转换为类型 a
new a create a new a 多元 创建类型 a 的新实例并调用其构造函数。
a + b concatenate string b to a 二元 如果 ab 是字符串,则返回其连接结果。
a ? b : c if a then b else c 三元 如果 atrue,返回 b,否则返回 c
a ?? b if a is null then b else a 二元 如果 anull,返回 b;否则返回 a
$"{b}" insert b into the string 多元 字符串插值,快速生成包含变量值的字符串(C# 6 起支持)。
$@"{b}" insert b into verbatim string 多元 将插值和逐字字符串功能结合使用(C# 6 起支持)。

Last modified: Saturday, 11 January 2025, 9:22 PM