IRONSOFTWAREHOME

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

10 分钟内完成 C# 10 和.NET 6 中的空参数检查

Tim Corey

4m 49s

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

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

准备工作——检查空参数

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

string? info = null;

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

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

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

SayHi(info);

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

你好
Text

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

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

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

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

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

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

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

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

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

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

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

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

ArgumentNullException.ThrowIfNull(message);

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

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

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));

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

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

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

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

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

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

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

ArgumentNullException 详情

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

它通常包括:

  • 导致问题的参数名称。

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

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

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

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

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);

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

Earn More by Sharing What You Love

Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Let's Stay in Touch!

Join our newsletter, you’ll get exclusive access on article updates. We value your privacy

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户