C#:问号

C#中问号主要有 6 种用法:可空类型修饰符 `?`、空条件运算符 `?.`、空索引运算符 `?\[\]`、空合并运算符 `??`、空合并赋值运算符 `??=` 和 三元条件运算符 `?:`。

用法速览

  1. `T?`(可空类型修饰符):用于值类型(如 `int`, `bool`),使其能赋值为 `null`,等价于 `Nullable<T>`。

  2. `?.`(空条件成员访问):安全访问对象成员,若对象为 `null` 则整式返回 `null`,不抛异常。

  3. `?\[\]`(空条件索引访问):安全访问数组/集合索引,若对象为 `null` 则返回 `null`。

  4. `??`(空合并运算符):左操作数为 `null` 时返回右操作数,否则返回左操作数(用于设默认值)。

  5. `??=`(空合并赋值运算符):仅当左操作数为 `null` 时,将右操作数赋值给左操作数(C8.0+)。

  6. `?:`(三元条件运算符):`条件 ? 真值 : 假值`,根据布尔条件选择返回两个表达式之一。

解析与场景

  • 可空类型 `T?`:仅适用于值类型(struct)。例如 `int? i = null;`。引用类型本身可为 null,无需加 `?`(但在可空上下文开启时 `string?` 表示显式允许 null)。

  • 空条件链 `?.` 与 `?\[\]`:支持链式调用(如 `obj?.Prop?.Method()?.Item`),任一环节为 `null` 即短路返回 `null`;若成员是非空值类型,结果自动提升为对应可空类型(如 `int?`)。

  • 空合并 `??`:右结合(`a ?? b ?? c` 即 `a ?? (b ?? c)`),右侧表达式仅在左侧为 `null` 时求值。注意:左操作数必须是可空类型或引用类型,`int x = 5 ?? 10;` 会编译报错。

  • 空合并赋值 `??=`:懒加载神器,等价于 `if (x == null) x = value;`,但右侧表达式同样仅在需要时执行。左操作数必须是变量/属性/索引器。

  • 三元 `?:`:唯一三元运算符,右结合。要求真/假分支类型可隐式转换为目标类型。

常见组合示例

int? a = null;

int b = a ?? 10; // b = 10 (?? 提供默认值)

a ??= 20; // a 现为 20 (??= 惰性赋值)

string? name = GetUser();

string display = name ?? "Guest"; // 空合并设默认

var first = list?.; // 空索引安全访问

var city = person?.Addr?.City; // 链式空条件

string status = score >= 60 ? "Pass" : "Fail"; // 三元条件

```

避坑提示

  • `?.` 返回的是可空类型,若需非空值必须配合 `??` 使用(如 `len ?? 0`)。

  • `??` 不处理"假值"(如 0、空字符串),只针对 `null`;逻辑或 `||` 才会处理假值。

  • 过度嵌套 `?:` 会降低可读性,复杂逻辑建议用 `if-else`。

相关推荐
QXWZ_IA1 分钟前
边坡监测预算有限时的建设顺序:虚拟基准站与成本账
网络·数据库
IT_陈寒3 分钟前
SpringBoot自动配置的坑,这次终于爬出来了
前端·人工智能·后端
这个DBA有点耶32 分钟前
1亿条向量内存降95.4%,延迟降80%:金仓AI原生内核真能解决RAG痛点?
数据库·人工智能·开源
Y38153266234 分钟前
用 httpx 写 SerpBase 异步客户端:连接池与超时配置
运维·服务器·数据库
c_hn_00743 分钟前
量化数据12:国内期货L2历史数据:Tick、逐笔、五档盘口一次性打包下载
数据库·1024程序员节·#深度订单簿数据·#历史行情订单薄·#本地csv数据存储
GeW1 小时前
从"补短板"到"强优势"Linux与数据库认证成为产业跃迁人才支点
linux·数据库
LuHang1 小时前
从天地图切换到高德地图:一次真实的底图迁移实战
前端·vue.js·cesium
用户360055579001 小时前
Kestrel_VLLM - 27 · 寄存器常驻与融合发射:两次「少发一次」
前端
前端小万1 小时前
用"道法术器"重构你和 AI 的协作方式
前端·人工智能·程序员
鶴哥只手遮天1 小时前
Angular 22 源码级深度解析-第 06 章 模板指令全解:`ɵɵelementStart`、`ɵɵproperty`、`ɵɵadvance` 与绑定指令
前端·开源·angular.js