
C#运算符 内置了丰富的运算符操作类型,使用方便,极大的简化了编码,同时还支持多种运算符重载机制,让自定义的类型也能支持运算符行为。
01、运算符概览
运算符分类 |
描述 |
数学运算 |
基础的加减乘除,及++、– |
赋值运算 |
=,及各种复合赋值op= ,x+=20; 等效于x=x+20; |
比较运算 |
比较相等、大小,内置类型大多支持,自定类型需要自己重载运算符才能支持 |
逻辑运算符 |
常用的就是非! 、短路逻辑与&& 、短路逻辑或 ||。 |
位运算 |
二进制位运算,适当使用可极大提高数据处理性能 |
类型相关运算符 |
类型判断is 、类型转换as 、typeof … |
指针操作运算符 |
指针相关运算符:*、&、-> |
其他运算符 |
^ 、.. 范围运算、nameof 、default (默认值)、await /async … |
运算符重载 |
public static Point operator +(Point p1, Point p2) {} |
隐式转换 |
public static implicit operator int(Point p1){} |
显示转换 |
public static explicit operator string(Point p){} |

02、运算符汇总🔣
运算符 |
描述 |
示例 |
+ |
加,字符串加为字符串连接,推荐字符内插$"{var}" |
|
- |
减,同+ 可用于委托,也可表示负数-100 |
|
* |
乘 |
|
/ |
除 |
|
% |
取余数 |
6%3; //=0 |
++ |
自加1,符号在前面的先运算,再赋值,在后面的反之 |
x=++y; //y=1+y; x=y; x=y++; //x=y; y=1+y; |
– |
自减1,同上 |
|
int a = 3;
int b = a +int.MaxValue;
int c = checked(a + int.MaxValue);
2.2、赋值运算
运算符 |
描述 |
示例/备注 |
= |
赋值运算符,一个神圣的仪式 |
|
+= |
加法赋值 |
x+=y //x=x+y |
-= |
减法赋值 |
x-=y //x=x-y |
*= |
乘法赋值 |
x*=y //x=x*y |
/= |
除法赋值 |
x/=y //x=x/y |
%= |
取余赋值 |
a%=3 //a=a%3 |
op= |
复合赋值x op = y = x = x op y |
上面这些都是复合赋值 |
= ref |
按引用赋值,可看做是别名,是同一个地址的别名 |
ref int b = ref a; |
?? ??= |
Null 合并赋值,为null 时就用后面的表达式值。 ??= 可用来设置默认值,或为null 时抛出异常 |
c = b1 ?? 5; name??= "sam"; _= sender ??throw... |
2.3、比较运算
运算符 |
描述 |
示例/备注 |
== |
相等比较,值类型比较值,应用类型比较地址 |
if(x == 0){} |
!= |
!= 不等于比较,与== 对应 |
if(x != 1){} |
>,< |
大于,小于 |
|
>=,<= |
大于等于,小于等于 |
|
🔸对于相等(==、!=)比较:
- 值类型比较的是数据值是否相等。
- 引用类型
==
比较的是其引用地址(对象),同 Object.ReferenceEquals。
- 字符串比较的字符串值,虽然他是引用类型(一个特殊的引用类型)。
- 用户定义的 struct 类型默认情况下不支持 == 运算符,需要自己重载运算符。可以用
Equals()
方法,会box装箱。
- C# 9.0 中的值类型 记录类型
record struct
支持 == 和 != 运算符,比较的是其内部值。这是因为record
内部实现了相等的运算符重载,比较了每个属性的值。
- 委托,如果其内部列表长度相同,且每个位置的元素相同则二者相等。
🔸对于大小比较:
2.4、逻辑运算符
运算符 |
描述 |
示例/备注 |
! |
! 逻辑非运算符,取反,颠掉黑白! |
!false //true |
& |
逻辑与,都为true 结果为true ,都会计算,前面false 还是会计算后面的 |
true & false //false |
^ |
逻辑异或,不同则为ture ,相同false |
true ^ false |