0Pricing
C# Academy · 课时

防范空值

验证与常用模式。

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

为什么要防范 null?

接收到意外 null 的方法,往往会在调用堆栈深处稍后因 NullReferenceException 而崩溃,导致问题难以理解。

防范 null 意味着预先检查参数并清晰地失败,这样错误就会直接指向真正的原因。

经典的 null 检查

最简单的防范方式是进行显式检查:当必需参数为 null 时抛出 ArgumentNullException。

这样可以在方法边界处验证输入,在任何工作开始之前发现问题。

void Save(string path)
{
    if (path == null)
        throw new System.ArgumentNullException(nameof(path));
    System.Console.WriteLine(path);
}

使用 nameof

请传入 nameof(path),而不是硬编码的字符串。这样,异常会报告准确的参数名称;即使您重命名参数,该名称也仍然正确。

当异常被记录时,这会让调试容易得多。

void Greet(string user)
{
    if (user is null)
        throw new System.ArgumentNullException(nameof(user));
    System.Console.WriteLine("Hi " + user);
}

ThrowIfNull 辅助方法

现代 C# 提供了 ArgumentNullException.ThrowIfNull(arg)。它会检查 null,并自动使用正确的参数名称抛出异常。

这种写法简洁,是当前 .NET 代码中首选的防范方式。

void Process(object data)
{
    System.ArgumentNullException.ThrowIfNull(data);
    System.Console.WriteLine("Processing");
}

一个可运行的防范示例

此程序展示了如何捕获 null 参数并清晰地报告问题,而不是等到稍后才崩溃。

请运行程序,查看异常消息如何指出错误参数的名称。

using System;

class Program
{
    static void Print(string text)
    {
        ArgumentNullException.ThrowIfNull(text);
        Console.WriteLine(text);
    }

    static void Main()
    {
        try { Print(null); }
        catch (ArgumentNullException ex) { Console.WriteLine(ex.ParamName); }
    }
}

使用 ?? throw 进行防范

您可以将赋值和防范结合起来,使用 ?? 配合 throw。这样就能在一行中完成验证和存储。

在为字段赋值时,这种模式常用于构造函数。

class Service
{
    private readonly string _name;
    public Service(string name)
        => _name = name ?? throw new System.ArgumentNullException(nameof(name));
}

空字符串与 null

对于字符串,null 和空字符串是两个不同的问题。请使用 string.IsNullOrEmpty 或 string.IsNullOrWhiteSpace,一次捕获这两种情况。

对于非 null 但为空的值,应使用 ArgumentException,而不是 ArgumentNullException。

void SetName(string name)
{
    if (string.IsNullOrWhiteSpace(name))
        throw new System.ArgumentException("Name required", nameof(name));
}

使用模式进行防范

is null 和 is not null 模式的可读性很好,并且不会受重载相等运算符的影响。

当某个类型可能重载 == 时,请优先使用 is null,而不是 == null。

object value = null;
if (value is null)
    System.Console.WriteLine("It is null");
if (value is not null)
    System.Console.WriteLine("Has value");

使用默认值而不是抛出异常

并非所有 null 都表示错误。有时,合理的默认值比异常更合适。

当 null 是可接受的情况时,请使用 ??;只有当值确实是必需的时,才抛出异常。

string BuildPath(string folder)
{
    folder ??= "/tmp";
    return folder + "/file.txt";
}

可空引用类型的帮助

启用可空引用类型后,如果您可能解引用一个可能为 null 的值,编译器会发出警告,从而在运行时之前发现错误。

声明 string(不可为空)还是 string?(可为空),既能记录您的意图,也能指导分析器。

#nullable enable
string required = "ok";
string? optional = null;
System.Console.WriteLine(optional?.Length ?? 0);

防范后安全使用

在方法开头完成防范后,方法体的其余部分就可以使用该值,而不必反复进行 null 检查。

此程序先进行防范,然后放心地使用参数。

using System;

class Program
{
    static int Length(string s)
    {
        ArgumentNullException.ThrowIfNull(s);
        return s.Length;
    }

    static void Main()
    {
        Console.WriteLine(Length("hello"));
    }
}

快速检查

请测试您对防范 null 的理解。

总结

请在方法开始处防范必需参数。使用 ArgumentNullException.ThrowIfNull,或将 ?? throw 与 nameof 结合使用,以提供清晰的错误信息。

请使用 string.IsNullOrWhiteSpace 处理空字符串,使用 is null 模式进行安全检查;当可以接受默认值时,使用 ??,而不是直接失败。

常见问题解答

「防范空值」课时是免费的吗?

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

「防范空值」这节课中我会学到什么?

验证与常用模式。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

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

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

「防范空值」课时需要多长时间?

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

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

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

此课程中的所有课时

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