.NET 10 & C# 14 New Features 新增功能介绍-Null 条件分配(Null-conditional assignment)

上篇文章中给大家介绍了:
.NET 10 & C# 14 New Features 新增功能介绍-扩展成员Extension Members

今天继续给大家分享:Null 条件分配(Null-conditional assignment)

C# 14 中新增了一种语法能力:

允许在使用 ?. 时进行赋值操作

一、原有代码实现方案

obj?.Property = 10; // ❌ 编译错误

?. 只能用于访问或调用:

obj?.Method();

var x = obj?.Property;

不能用于赋值。

二、C# 14:允许 Null 条件赋值

现在可以直接这么写:

obj?.Property = 10;

等价于:

if (obj != null)

{

obj.Property = 10;

}

以这个代码示例:

receiver?.Member = value;

语义:

    1. 只对 receiver 进行一次求值

    2. 如果为 null,整个表达式直接结束

    3. 如果不为 null,则执行赋值

不会抛出 NullReferenceException

三、典型应用场景

简化防御式编程

原有:

if (user != null)

{

user.Name = "Tom";

}

现在:

user?.Name = "Tom";

结合链式调用

order?.Customer?.Address = newAddress;

等价于:

if (order?.Customer != null)

{

order.Customer.Address = newAddress;

}

四、与 ??= 的区别

??= 是"空值合并赋值"

复制代码
obj ??= new MyClass();

如果 obj 是 null,则赋新值。

?. 赋值是"存在才赋值"

复制代码
obj?.Property = value;

如果 obj 不为 null,才执行赋值。

五、性能分析

✔ 没有额外性能损耗

✔ 与手写 null 判断几乎一致

✔ JIT 会优化

对高频代码路径安全。

周国庆

20260220