C# Academy · 课时

空值合并运算符

?? 和 ??= 默认值。

第 3 / 4 课13 个步骤

空值合并运算符 是 CoddyKit 上的免费 C# Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。

提供回退值

您通常会希望值存在时使用该值,为 null 时使用默认值。空值合并运算符 ?? 正是用于此目的。

a ?? b 的含义是:如果 a 不为 null,则使用 a;否则使用 b。

string input = null;
string name = input ?? "Guest";
System.Console.WriteLine(name);

?? 的求值方式

系统会先计算左侧。如果左侧不为 null,右侧就完全不会计算。

这种短路行为意味着,开销较大的回退值只会在确实需要时计算。

string cached = "data";
string value = cached ?? Compute();
System.Console.WriteLine(value);
// Compute() is never called here

适用于可空值类型

?? 也可以展开可空值类型。将 int? maybe 与 ?? 0 结合后,会得到普通的不可为空 int。

这是将 int? 使用默认值转换为 int 的简洁方式。

int? maybe = null;
int sure = maybe ?? 0;
System.Console.WriteLine(sure);

一个可运行的示例

此程序读取一个可能为空的设置,并在其为空时回退到默认值。请运行程序,查看回退值如何生效。

using System;

class Program
{
    static void Main()
    {
        string theme = null;
        string active = theme ?? "light";
        Console.WriteLine("Theme: " + active);
    }
}

串联 ??

您可以串联多个回退值。表达式会从左到右选择第一个不为 null 的值。

a ?? b ?? c 会依次尝试 a、b,最后将 c 作为最终回退值。

string a = null;
string b = null;
string c = "default";
System.Console.WriteLine(a ?? b ?? c);

??= 运算符

空值合并赋值运算符 ??= 仅在左侧当前为 null 时,才会将右侧的值赋给左侧。

x ??= y 是 if (x == null) x = y; 的简写;如果 x 已有值,则保持不变。

string config = null;
config ??= "default";
System.Console.WriteLine(config);
config ??= "ignored";
System.Console.WriteLine(config);

使用 ??= 延迟初始化

??= 的常见用途是延迟初始化:仅在对象第一次需要时创建它。

后续调用时,字段已经完成赋值,因此 ??= 不会执行任何操作。

System.Collections.Generic.List<int> items = null;
items ??= new System.Collections.Generic.List<int>();
items.Add(1);
System.Console.WriteLine(items.Count);

结合使用 ?. 和 ??

将 ?. 与 ?? 配合使用非常常见。?. 可以避免异常,?? 则会在链为 null 时提供一个值。

user?.Name ?? "Unknown" 会安全地读取姓名;如果无法读取,则使用默认值 "Unknown"。

string s = null;
int length = s?.Length ?? -1;
System.Console.WriteLine(length);

完整程序中的 ??

这里将 ?. 和 ?? 结合使用,以输出安全的长度。请使用 null 字符串运行程序,查看回退值的效果。

using System;

class Program
{
    static void Main()
    {
        string username = null;
        string display = username ?? "anonymous";
        Console.WriteLine(display);
        Console.WriteLine(username?.Length ?? 0);
    }
}

使用 ?? 在 null 时抛出异常

?? 的右侧可以是任何表达式,包括 throw。这样,?? 就能以简洁的方式在遇到意外的 null 时快速失败。

name ?? throw new ArgumentNullException(nameof(name)) 会返回姓名;如果姓名为 null,则抛出异常。

string Validate(string name) =>
    name ?? throw new System.ArgumentNullException(nameof(name));

从右向左结合

?? 是从右向左结合的,因此 a ?? b ?? c 会分组为 a ?? (b ?? c)。

实际使用时,这仍然表示“第一个不为 null 的值胜出”,但在分析复杂表达式时,了解这一点很有帮助。

int? a = null;
int? b = null;
int result = a ?? b ?? 99;
System.Console.WriteLine(result);

快速检查

请测试您对空值合并运算符的理解。

总结

?? 在左侧不为 null 时返回左侧,否则返回右侧,并且可以串联使用。??= 仅在目标为 null 时赋值,非常适合延迟初始化。

请将它们与 ?. 结合使用,以简洁而安全地处理 null;还可以使用 ?? throw 来快速失败。

免费开始

用 AI 导师学习 C# — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
93
课程
346

常见问题解答

「空值合并运算符」课时是免费的吗?

是的 — 「空值合并运算符」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。

「空值合并运算符」这节课中我会学到什么?

?? 和 ??= 默认值。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「空值合并运算符」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 可空值类型
  2. 空值条件运算符
  3. 空值合并运算符
  4. 防范空值
← 返回 C# Academy