跳至页脚内容
Iron Academy Logo
C# 和 .NET 中的新内容

C# 10 和 .NET 6 中的空参数检查只需 10 分钟或更短时间

Tim Corey
4m 49s

在 C# 中工作时,开发人员经常会遇到向方法传递空参数的情况。 如果处理不当,这可能会导致意外行为、运行时错误,甚至未处理的异常。 在视频" 10 分钟或更短时间内了解 C# 10 和 .NET 6 中的空参数检查"中,Tim Corey 解释了 C# 10 如何使用 ArgumentNullException 类简化空值处理。

在本文中,我们将按照 Tim 的讲解,逐一观看视频,以了解空值检查的工作原理以及它们在现代 C# 中的改进情况。

准备工作——检查空参数

Tim 首先创建了一个简单的 .NET 6 控制台应用程序,以展示 C# 中如何处理空参数检查。 他清除了样板代码,并声明了一个可为空的字符串变量:

string? info = null;
string? info = null;

这个空对象表示方法调用可能接收到未正确实例化的参数的情况。 蒂姆随后定义了一个简单的方法:

void SayHi(string message)
{
    Console.WriteLine($"你好 {message}");
}
void SayHi(string message)
{
    Console.WriteLine($"你好 {message}");
}

他将 info 变量传递给该方法:

SayHi(info);
SayHi(info);

程序运行时,输出结果仅显示:

你好

由于字符串连接接受空值并将其视为空字符串,因此不会发生异常。 但正如 Tim 指出的那样,在大多数实际方法中,这可能会导致容易出错的情况,即空引用导致下游问题或在调用堆栈的后面出现 NullReferenceException。

为了编写健壮的代码,开发人员应该验证参数,并确保任何方法都期望有效的、非空的输入。

C# 10 之前的传统空值检查

Tim 解释说,在 C# 10 之前,良好的做法是手动检查参数,并在需要时抛出 ArgumentNullException 异常。 在 SayHi 方法中,他补充道:

if (message is null)
    throw new ArgumentNullException(nameof(message));
if (message is null)
    throw new ArgumentNullException(nameof(message));

此检查确保如果传递了空参数,程序会立即抛出 ArgumentNullException 类的新实例。

当 Tim 运行代码时,错误信息清晰地显示出来:

System.ArgumentNullException: Value cannot be null. (Parameter 'message')
System.ArgumentNullException: Value cannot be null. (Parameter 'message')

此未处理的异常表明该方法接收到了无效参数。 参数名称(在本例中为"message")会自动显示在输出中,帮助开发人员准确识别哪个参数导致了问题。

Tim 指出,这种手动检查在 .NET Framework 和更早的 .NET Core 版本中运行良好。 但是,当处理多个参数时,这种方法显得冗长且重复。 每增加一个需要验证的参数,就会增加三到四行代码,使方法体变得臃肿。

C# 10 中的简化方法 – ArgumentNullException.ThrowIfNull()

此时,Tim 介绍了现代 C# 10 语法。 现在,开发人员无需为每个参数编写多行代码,只需编写一行空值检查代码即可:

ArgumentNullException.ThrowIfNull(message);
ArgumentNullException.ThrowIfNull(message);

Tim解释说,这行代码内部执行的是相同的验证逻辑。 如果传递的参数为空,该方法会自动抛出异常——就像以前一样——但语法更加简洁。

程序再次运行时,会出现以下输出:

System.ArgumentNullException: Value cannot be null. (Parameter 'message')
System.ArgumentNullException: Value cannot be null. (Parameter 'message')

行为保持不变,但语法已简化。 无需使用构造函数手动实例化一个新的 ArgumentNullException 对象,也无需手动指定 paramName 参数。 调用者的参数名称由编译器自动推断。

Tim 强调,这一改进节省了时间,并降低了因引用错误参数名称而导致人为错误的几率。

示例:多个参数

然后,Tim 将处理多个参数时的传统方法与新方法进行了比较。

在 C# 10 之前,开发人员可能会这样写:

if (name is null)
    throw new ArgumentNullException(nameof(name));
if (email is null)
    throw new ArgumentNullException(nameof(email));
if (password is null)
    throw new ArgumentNullException(nameof(password));
if (name is null)
    throw new ArgumentNullException(nameof(name));
if (email is null)
    throw new ArgumentNullException(nameof(email));
if (password is null)
    throw new ArgumentNullException(nameof(password));

借助C# 10 的增强功能,现在可以更简洁地编写相同的检查:

ArgumentNullException.ThrowIfNull(name);
ArgumentNullException.ThrowIfNull(email);
ArgumentNullException.ThrowIfNull(password);
ArgumentNullException.ThrowIfNull(name);
ArgumentNullException.ThrowIfNull(email);
ArgumentNullException.ThrowIfNull(password);

这种改进不仅仅是减少了代码行数——它使你的方法更简洁、更易读、更易于维护。 Tim 指出,如果你的方法需要三个参数,那么现在你只需要进行三次空值检查,而不是十二行代码。

为什么这很重要——更安全、更健壮的代码

Tim 指出,虽然在演示中手动将 null 传递给字符串可能不太现实,但这代表了现实世界的问题。 API、用户输入、反序列化过程或对象返回操作可能会意外地产生空对象。

通过在方法开头添加空值检查,可以防止意外行为并快速失败——这意味着程序会在问题传播之前在调用堆栈的早期抛出异常。

他还提到,这种新语法有助于你在各种方法中保持一致的错误处理模式。 它鼓励编写健壮的代码,使其能够抵御无效输入和未实例化的对象。

ArgumentNullException 详情

Tim 强调 ArgumentNullException 是 System 命名空间的一部分,并且继承自 ArgumentException 类。 当向不接受空引用作为有效参数的方法传递空引用时,就会抛出此异常。

它通常包括:

  • 导致问题的参数名称。

  • 显示清晰的错误信息:"值不能为空。"

  • 显示异常发生位置的调用堆栈。

Tim 的例子表明,.NET 6 如何在改进语法的同时继续遵循这种行为。

他还简要指出,开发人员可以将这些检查与其他功能(例如空值合并运算符 (??) 或默认值)结合起来,以提供回退逻辑——例如:

message ??= "Default message";
message ??= "Default message";

这样一来,如果需要,方法就可以分配默认值而不是抛出异常。

错误处理中空值检查的重要性

Tim 提醒开发人员,尽管 C# 现在支持可空引用类型,但运行时空值检查仍然至关重要。 编译器无法捕获所有空引用问题——尤其当数据来自外部来源或不受您控制的方法时。

他强调,检查参数并在适当的时候抛出 ArgumentNullException 是一种良好的做法,以确保该方法仅在输入有效时执行。 这样可以最大限度地减少运行时错误,简化错误处理,并防止静默故障。

总结与展望

Tim 在总结中指出,C# 11 将引入更多增强功能,但就目前而言,ArgumentNullException.ThrowIfNull() 是 .NET 6 中错误处理和代码安全方面最好的小改进之一。

他鼓励开发者在自己的项目中尝试这种方法,看看他们的方法会变得多么简洁。 他最后提出了一个问题:"您对 C# 10 中的这一变化有什么看法?"

最后的想法

Tim Corey 的视频清楚地表明,ArgumentNullException.ThrowIfNull() 方法是 C# 10 中一个简单而强大的改进。它减少了容易出错的手动代码,确保参数有效,并在传递空参数时使程序快速失败。

通过持续使用这种方法,开发人员可以构建健壮、易读、易维护的代码,这些代码可以干净利落地处理异常,并避免难以察觉的空引用错误。

简而言之,当你的方法需要一个有效参数并且你想避免出现空参数时,请参考 Tim Corey 的示例并使用:

ArgumentNullException.ThrowIfNull(parameterName);
ArgumentNullException.ThrowIfNull(parameterName);

在 .NET 6 及更高版本中,这是一种更简洁、更安全、更现代的方式来保护您的代码免受空值和运行时错误的影响。

Hero Worlddot related to C# 10 和 .NET 6 中的空参数检查只需 10 分钟或更短时间
Hero Affiliate related to C# 10 和 .NET 6 中的空参数检查只需 10 分钟或更短时间

分享您的所爱,赚取更多收入

您为使用 .NET、C#、Java、Python 或 Node.js 的开发人员创建内容吗?将您的专业知识转化为额外收入!

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我