防范空值
验证与常用模式。
防范空值 是 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 反馈 — 无需本地设置。