C#面试题更新 2026-08-05

请解释 C# 语言中的空合并赋值运算符(??=)的含义,并说明其正确的使用方式。

技术原理C#

考察说明

考查对 C# 特定运算符(??=)的理解和实际应用能力。

回答思路

  1. 【回答框架 1】空合并赋值运算符 ??= 是 C# 8.0 引入的语法糖,用于简化将可空类型赋值给非空类型的常见模式。其核心语义是:当左侧操作数为 null 时,才将右侧操作数的值赋给左侧变量;若左侧操作数非 null,则保持原值不变,右侧表达式不会被求值。
  2. 【回答框架 2】使用方式如下:假设一个可空变量 int? maybe = null,执行 maybe ??= 10;后,maybe 变为 10。若 maybe 原为非 null,例如初始值为 5,执行后仍为 5。该运算符适用于引用类型和可空值类型,要求左侧是变量、属性或索引器等可赋值实体,右侧可以是任意表达式。
  3. 【回答框架 3】与空合并运算符 ?? 的区别:?? 用于在左侧为 null 时提供替代值,但不会改变左侧变量的值,通常配合赋值语句使用;而 ??= 直接修改左侧变量本身。二者结合可简化代码,例如 x = x ?? 1 可简写为 x ??= 1。
  4. 【回答框架 4】需要注意,??= 不是线程安全的原子操作,若需并发环境下的原子更新,应使用 Interlocked.CompareExchange 等机制。此外,在属性或索引器上使用 ??= 时,会调用对应的 setter,而非原地修改字段。
  5. 【关键点 1】??= 是 C# 8.0 的空合并赋值运算符,左侧为 null 时才赋值。
  6. 【关键点 2】左侧必须为变量、属性或索引器,右侧可为任意表达式。
  7. 【关键点 3】与 ?? 不同,??= 会直接修改左侧值。
  8. 【关键点 4】该运算符合法用于引用类型和可空值类型。
  9. 【易错点 1】误以为 ??= 是原子操作,在并发场景下不加同步可能导致竞态条件。
  10. 【易错点 2】将 ??= 与 ?? 混淆,认为 ??= 不修改左侧变量。
  11. 【易错点 3】在属性上使用 ??= 时,忽略其会调用 setter,可能带来额外副作用。