CSharp(十) 其他运算符
成员访问运算符
| 运算符 | 名称 | 示例 | 说明 |
|---|---|---|---|
. |
成员访问 | obj.Method() | 访问对象的方法或属性 |
?. |
空条件成员访问 | obj?.Method() | 访问对象的方法或属性,如果对象为null则返回null |
?[] |
空条件索引器访问 | obj?.[index] | 访问对象的索引器,如果对象为null则返回null |
[] |
索引器 | arr[index] | 访问数组的元素 |
() |
调用/分组 | Method()(a+b) |
调用方法或者改变优先级 |
^ |
索引从末尾 | array[^1] |
倒数第 1 个元素(C# 8+) |
.. |
范围 | array[1..4] |
索引 1 到 3 的元素(C# 8+) |
类型相关运算符
| 运算符 | 名称 | 示例 | 说明 |
|---|---|---|---|
is |
类型检查 | obj is string | 检查是否为某类型 |
as |
类型转换 | obj as string | 安全转换,失败返回 null |
typeof |
获取类型 | typeof(int) | 获取 Type 对象(C# 8+) |
sizeof |
获取大小 | sizeof(int) | 获取类型字节大小(C# 8+) |
nameof |
获取名称 | nameof(variable) | 获取标识符名称(C# 6+) |
模式匹配运算符
| 运算符 | 示例 | 说明 |
|---|---|---|
| is | x is int i | 声明模式 |
| and | x is > 0 and < 10 | 合取模式(C# 9+) |
| or | x is 1 or 2 | 析取模式(C# 9+) |
| not | x is not null | 否定模式(C# 9+) |
| .. | var [a, .., b] = array | 列表模式(C# 11+) |
空相关运算符
| 运算符 | 名称 | 示例 | 说明 |
|---|---|---|---|
| ?? | 空合并 | x ?? y | x 为 null 时返回 y |
| ??= | 空合并赋值 | x ??= y | x 为 null 时将 y 赋给 x |
| ?. | 空条件访问 | obj?.Property | obj 为 null 时返回 null |
| ?[] | 空条件索引 | list?[0] | list 为 null 时返回 null |
三元/条件运算符
| 运算符 | 示例 | 说明 |
|---|---|---|
| ?: | condition ? a : b | 条件为真返回 a ,否则返回 b |
其他运算符
| 运算符 | 名称 | 示例 | 说明 |
|---|---|---|---|
| => | Lambda | x => x* 2 | 定义匿名函数 |
| = | Lambda 赋值 | Func |
- |
| delegate | 匿名方法 | delegate(int x) { return x; } 已较少使用 | 已经较少使用 |
| stackalloc | 栈分配 | stackalloc int[10] | 在栈上分配内存 |
| switch | Switch 表达式 | value switch { 1 => "one",_ => "other" } | Switch 表达式(C# 8+) |
| with | 记录复制 | record with { Property = value } | 非破坏性变更(C# 9+) |
运算符优先级(由高到低)
| 优先级 | 运算符 |
|---|---|
| 1 | () [] . ?. ?[] ++ (后缀) -- (后缀) ^ .. |
| 2 | ++ (前缀) -- (前缀) + (正) - (负) ! ~ typeof nameof sizeof stackalloc |
| 3 | * / % |
| 4 | + - |
| 5 | << >> >>> |
| 6 | < > <= >= is as |
| 7 | == != |
| 8 | & |
| 9 | ^ |
| 10 | 逻辑或 |
| 11 | && |
| 12 | 短路或 |
| 13 | ?? |
| 14 | ?: switch |
| 15 | = += -= 等所有赋值运算符 |
| 16 | => => delegate stackalloc with |