You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 8中如何用null coalescing检查对象属性null后赋值

C# 空安全属性赋值的优化实现

原代码的逻辑问题

你当前使用的三元判断写法存在分支颠倒的bug:

foo1.FooBar.BarId = foo2.FooBar == null ? foo2.FooBar.Barid : 0;

该代码在foo2.FooBar为null时,反而尝试访问其Barid属性,会直接抛出空引用异常;非空场景下反而赋值为0,完全和预期逻辑相反。

兼容C# 8的简洁实现

针对这类属性访问前的判空需求,可通过空条件运算符 + null合并运算符的组合替代冗余三元判断,代码可读性和安全性都更高:

  • 空条件运算符 ?.:当左侧实例为null时直接短路返回null,不会触发后续的属性访问,从根源避免空引用
  • null合并运算符 ??:当左侧求值结果为null时,自动返回右侧设置的兜底值

对应场景下的正确赋值代码:

foo1.FooBar.BarId = foo2.FooBar?.BarId ?? 0;

执行逻辑

  • 当foo2.FooBar为null时,foo2.FooBar?.BarId直接短路返回null,不会尝试访问属性
  • ??运算符检测到左侧结果为null,将兜底值0赋值给目标属性
  • 当foo2.FooBar不为null时,正常读取BarId的整数值完成赋值

使用注意

  • 空条件运算符?.仅支持取值场景,不能作为赋值语句的左值。例如foo2.FooBar?.BarId = 0无法通过编译:若foo2.FooBar为null,赋值操作没有明确的目标对象,编译器会直接拦截报错。
  • 对于多层嵌套的属性访问,只需要在每一层可能为null的对象后追加?.即可,例如foo2.FooBar?.Parent?.Name ?? "默认值",无需嵌套多层三元判断。

内容的提问来源于stack exchange,提问作者JohnB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 19:15:03