1.3C#语言的运算符(Operator)

1.一元运算符

运算符描述
+x一元 + 运算符返回其操作数的值。
-x一元 - 运算符对其操作数的数值取负。
++x++x 的结果是此操作后的 x 的值。
--x--x 的结果是此操作后的 x 的值。
x++x++ 的结果是此操作前的 x 的值。
x--x-- 的结果是此操作前的 x 的值。

2.算数运算符

运算符描述
x + y加法、字符串连接、委托组合
x - y减法、委托移除
x * y乘法
x / y除法
x % y余数

3.赋值运算符

运算符描述
x = y赋值
x += y加法赋值、订阅事件、字符串连接赋值
x -= y减法赋值、取消订阅事件
x *= y乘法赋值
x /= y除法赋值
x %= y余数赋值
x &= y逻辑与赋值、位逻辑与赋值
x |= y逻辑或赋值、位逻辑或赋值
x ^= y逻辑异或赋值、位逻辑异或赋值
x <<= y左移位赋值
x >>= y右移位赋值
=>匿名函数(lambda 表达式)

4.比较运算符

运算符名称描述
x < y小于如果左侧操作数小于右侧操作数,< 运算符返回 true,否则返回 false
x > y大于如果左侧操作数大于右侧操作数,> 运算符返回 true,否则返回 false
x <= y小于或等于如果左侧操作数小于或等于右侧操作数,<= 运算符返回 true,否则返回 false
x >= y大于或等于如果左侧操作数大于或等于右侧操作数,>= 运算符返回 true,否则返回 false

5.布尔逻辑运算符

& 运算符与 && 运算符的区别是:如果左侧操作数的计算结果为 false&& 运算符则不会计算右侧操作数。而 & 运算符 无论左侧操作数的计算结果是 truefalse,都会计算右侧操作数。因此, && 运算符 的性能比 & 运算符 高。x | y 运算符与 x || y 运算符的区别类似。

运算符名称描述
!x逻辑非如果 x 的计算结果为 false,则 !x 的结果为 true,否则,结果为 false
x & y逻辑与如果 x 和 y 的计算结果都为 true,则 x & y 的结果为 true,否则,结果为 false
x? & y?可为null的逻辑与如果 xy 的计算结果都为 true ,则 x & y 的结果为 true。 如果 x 或 y 的计算结果为 false,则 x & y 的结果为false(即使另一个操作数的计算结果为 null)。 否则,x & y 的结果为 null
x | y逻辑或如果 x 或 y 的计算结果为 true,则 x | y 的结果为 true。 否则,结果为 false
x? | y?可为null的逻辑或如果 xy 的计算结果都为 false 时,则 x | y 的结果为 false。 如果 x 或 y 的计算结果为 true,则 x | y 的结果为 true(即使另一个操作数的计算结果为 null)。否则,x | y 的结果为 null
x ^ y逻辑异或如果 x 的计算结果为 true 且 y 的计算结果为 false,或者 x 的计算结果为 false 且 y 的计算结果为 true,那么 x ^ y 的结果为 true。 否则,结果为 false。 
x && y条件逻辑与x & y
x? && y? 可为null的条件逻辑与 x? & y?
x || y条件逻辑或x | y
x? || y? 可为null的条件逻辑或 x? | y?
andand运算符x & y。例如,>= 3 and < 6 => “spring”。
oror运算符x | y。例如,12 or (>= 1 and < 3) => “winter”。

6.相等运算符

运算符名称描述
x == y相等如果操作数相等,等于运算符 == 返回 true,否则返回 false
x != y不等如果操作数不相等,不等于运算符 != 返回 true,否则返回 false。 

7.三元条件运算符

运算符描述
c ? t : f如果 x 为 true,则计算 y;如果 x 为 false,则计算 z

8.位运算符和移位运算符

运算符名称描述
~x按位求补~ 运算符通过反转每个位产生其操作数的按位求补。
x & y位逻辑与& 运算符计算其整型操作数的位逻辑 与。
x | y位逻辑或| 运算符计算其整型操作数的位逻辑 或。
x ^ y位逻辑异或^ 运算符计算其整型操作数的位逻辑 异或。
x << y向左移位<< 运算符将其左侧操作数向左移动右侧操作数定义的位数。
x >> y向右移位>> 运算符将其左侧操作数向右移动右侧操作数定义的位数。

9.类型测试运算符

运算符名称描述
typeof(T)typeof运算符typeof 运算符用于获取某个类型的 System.Type 实例。
nameof(T)nameof运算符nameof 表达式可生成变量、类型或成员的字符串常量名称。例如,Console.WriteLine(nameof(System.Collections.Generic)); // output: Generic
sizeof(T)sizeof运算符sizeof 运算符返回给定类型的变量所占用的字节数。
E is T ais 表达式如果 E 表达式 的类型与 T 类型 兼容,则返回 true 并将 E 表达式的值赋值给变量 a ;否则,返回 false
E is not T is not 表达式 如果 E 表达式 的类型与 T 类型 不兼容,则返回 true ;否则,返回 false
E as Tas 运算符如果 E 表达式能转换为 T 类型,则返回类型为 T 的 E,否则返回 null。等同于E is T ? (T)(E) : (T)nullas 运算符仅考虑引用类型、Nullable、装箱和取消装箱转换,不能使用 as 运算符执行用户定义的转换,为此,请使用强制转换表达式。
(T)E强制转换表达式形式为 (T)E 的强制转换表达式将表达式 E 的结果显式转换为类型 T。 如果不存在从类型 E 到类型 T 的显式转换,则发生编译时错误。

10.成员访问运算符

运算符名称描述
a.x成员访问表达式用于访问命名空间或类型的成员。
f(x)调用表达式使用括号 () 调用方法或调用委托。
a[i]索引器运算符方括号 [] 通常用于数组、索引器或指针元素访问。
^n从末尾运算符 ^ 开始索引对于长度为 length 的序列,^n 指向与序列开头偏移 length - n 的元素。例如,^1 指向序列的最后一个元素,^length 指向序列的第一个元素。
x..y范围运算符左侧操作数是范围的包含性开头,右侧操作数是范围的不包含性末尾。

11.Null运算符

运算符名称描述
a?.xNull条件运算符如果 a 为非 null,则 a?.x 的结果将与 a.x 的结果相同。否则,将返回 null
a?[i]Null条件运算符如果 a 为非 null,则 a?[i] 的结果将与 a[x] 的结果相同。否则,将返回 null
x ?? yNull合并运算符如果 xnull,则返回值为 y ,否则返回 x
x ??= yNull合并赋值运算符如果 xnull,则将 y 赋值给 x ,否则不赋值。
x!Null包容运算符通过使用 NULL包容运算符,可以告知编译器传递 null 是预期行为,不应发出警告。

12.指针运算符

unsafe
{
    int number = 27;
    int* pointerToNumber = &number;

    Console.WriteLine($"Value of the variable: {number}");
    Console.WriteLine($"Address of the variable: {(long)pointerToNumber:X}");
}
// Output is similar to:
// Value of the variable: 27
// Address of the variable: 6C1457DBD4
运算符名称描述
&x地址运算符用于获取变量的地址。
*x指针间接运算符用于获取指针指向的变量。
x->y指针成员访问运算符-> 运算符将指针间接运算符和成员访问表达式的合并。等同于(*x).y
p[n]指针元素访问运算符对于指针类型的表达式 pp[n] 形式的指针元素访问计算方式为 *(p + n),其中 n 必须是可隐式转换为 intuintlong 或 ulong 的类型。

13.::运算符

运算符描述
::使用命名空间别名限定符 :: 访问已设置别名的命名空间的成员。

14.default运算符

运算符名称描述
default(T)default运算符default 运算符的实参必须是类型或类型形参的名称,例如:Console.WriteLine(default(int)); // output: 0。
defaultdefault字面值可以使用 default 文本生成类型的默认值,例如:T initialValue = default。
default:default标签可以将 default 关键字用作 switch 语句中的默认用例标签。

15.true和false运算符

true 运算符返回 bool 值 true,以指明其操作数一定为 true。 false 运算符返回 bool 值 true,以指明其操作数一定为 false。

16.new运算符

表达式描述
new T(...);对象和委托创建
new(...);如果已知表达式的目标类型,则可以省略类型名称。
new T {...};使用对象初始值设定项(Object Initializer)创建对象。
new(){};如果已知表达式的目标类型,则可以省略类型名称且使用对象初始值设定项(Object Initializer)创建对象。
new {...};要创建匿名类型的实例,请使用 new 运算符和对象初始值设定项(Object Initializer)语法。
new T[n];创建数组元素类型为 T ,长度为 n 的数组。
new T[n] {...}; 创建数组元素类型为 T ,使用对象初始值设定项(Object Initializer)创建数组。

17.await运算符

await 运算符暂停对其所属的 async 方法的求值,直到其操作数表示的异步操作完成。

await x

18.delegate运算符

delegate 运算符创建一个可以转换为委托类型的匿名方法。

delegate { ... }

注意:与delegate关键字两回事,delegate 关键字是用来声明委托类型。

19.checked和unchecked运算符

在checked上下文中计算表达式。

在unchecked上下文中计算表达式。

checked(x);
unchecked(x);

20.switch表达式

可以使用 switch 表达式,将与 方法形参兼容 的 输入表达式 与 => 运算符左侧的候选表达式进行比较,从而返回第一个匹配的候选表达式右侧的表达式的值。

注意:switch 表达式虽与选择语句里的 switch 语句提供类似的功能,但是是两回事。

候选表达式可以是整数、浮点、布尔、char、string、枚举、null、类型名称、弃元变量、比较表达式、属性表达式等等。

候选表达式或许表现力不够,在这种情况下,可以附加 case guard,必须与候选表达式同时满足。可以在候选表达式后面的 when 关键字之后指定一个 case guard,case guard 必须是布尔表达式。

返回类型 方法名(形参) => 输入表达式 switch
{
    候选表达式1 => 表达式1,
    候选表达式2 => 表达式2,
    候选表达式3 [when 布尔表达式3] => 表达式3,
    候选表达式N [when 布尔表达式N] => 表达式N,
}

21.stackalloc运算符

stackalloc 表达式在堆栈上分配内存块。

stackalloc

22.with表达式

with 表达式使用修改的特定属性和字段生成其操作数的副本。

with

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/csharp/csharplang/7863.html

发表评论

登录后才能评论