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
相关产品推荐
相关产品推荐

