0Pricing
C# Academy · 课时

空值条件运算符

使用 ?. 安全访问。

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

空值链的问题

访问 null 引用的成员会抛出 NullReferenceException。这是 C# 运行时崩溃中最常见的一种。

当您像 user.Address.City 这样链式调用时,链中的任何一环都可能为 null;过去的解决方法是层层嵌套 if 检查。

认识 ?.

空值条件运算符 ?. 会让整个表达式短路。如果左侧为 null,结果会是 null,而不是抛出异常。

它可以理解为:“访问此成员,但仅当对象不为 null 时才访问。”

string name = null;
int? length = name?.Length;
System.Console.WriteLine(length == null);

结果会变为可空类型

由于 ?. 可能产生 null,结果类型会变为可空类型。name?.Length 的类型是 int?,而不是 int。

因此,您应将它存储在 int? 中,而不是普通的 int 中。

string text = "hello";
int? len = text?.Length;
System.Console.WriteLine(len);

一个可运行的示例

此程序展示了对象存在时 ?. 如何返回值,以及对象不存在时如何返回 null。

请运行程序并注意:它始终不会抛出异常。

using System;

class Program
{
    static void Main()
    {
        string a = "world";
        string b = null;
        Console.WriteLine(a?.ToUpper());
        Console.WriteLine(b?.ToUpper() ?? "(null)");
    }
}

串联多个 ?.

您可以在多个成员之间串联使用 ?.。只要任何一部分为 null,整个链就会停止并返回 null。

因此,即使 customer 或 Order 为 null,customer?.Order?.Total 也是安全的。

string s = null;
int? upperLen = s?.ToUpper()?.Length;
System.Console.WriteLine(upperLen == null);

空值条件索引器 ?[]

数组和列表提供一种索引器形式 ?[]。如果集合为 null,索引访问会返回 null,而不是导致程序崩溃。

请注意:它只能防止集合为 null,不能防止索引超出范围。

int[] data = null;
int? first = data?[0];
System.Console.WriteLine(first == null);

安全地调用方法

?. 也可以保护方法调用。只有当 list 不为 null 时,list?.Clear() 才会调用 Clear;否则什么也不做。

对于返回 void 的方法,值为 null 时,整个语句只会变成空操作。

System.Collections.Generic.List<int> list = null;
list?.Add(5);
System.Console.WriteLine("No crash");

线程安全地引发事件

一个经典用法是引发事件。SomeEvent?.Invoke(this, args) 仅在至少有一个处理程序订阅时才会安全地触发事件。

它取代了旧的空值检查模式,因为旧模式可能在检查和调用之间发生竞态。

System.Action handler = null;
handler?.Invoke();
System.Console.WriteLine("Invoked safely");

与 ?? 结合使用

?. 经常与空值合并运算符 ?? 自然地结合使用,以便在链为 null 时提供回退值。

name?.Length ?? 0 会返回长度;如果 name 为 null,则返回 0。

string name = null;
int length = name?.Length ?? 0;
System.Console.WriteLine(length);

一个容易忽略的细节

即使最终值类型不可为空,使用 ?. 仍会使表达式变为可空类型。list?.Count 的类型是 int?,而不是 int。

如果您需要普通的 int,请在后面加上 ?? 0,或使用 GetValueOrDefault()。

var list = new System.Collections.Generic.List<int> { 1, 2 };
int count = list?.Count ?? 0;
System.Console.WriteLine(count);

完整对比

此程序将冗长的 if 方法与简洁的 ?. 版本进行对比。两者都能避免异常,但 ?. 清晰得多。

using System;

class Program
{
    static void Main()
    {
        string s = null;
        int len = s != null ? s.Length : -1;
        Console.WriteLine(len);
        Console.WriteLine(s?.Length ?? -1);
    }
}

快速检查

请测试您对空值条件运算符的理解。

总结

空值条件运算符 ?.(以及索引器 ?[])会在对象为 null 时停止成员访问,并返回 null,而不是抛出异常。

结果会变为可空类型,因此请将它与 ?? 结合使用,以提供回退值。

常见问题解答

「空值条件运算符」课时是免费的吗?

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

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

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

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

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

「空值条件运算符」课时需要多长时间?

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

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

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

此课程中的所有课时

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