防止空参数导致“空引用异常”

本文关键字:引用 异常 空引用异常 参数 | 更新日期: 2023-09-27 18:37:01

在我的库中,我经常公开将字符串作为参数的方法。我应该总是检查字符串参数是否等于null吗?或者可以忽略会导致NullreferenceExceptionnull值的可能性?

例:

public static void Parse(string line)
{
     string[] splits = line.Split(' ');
}

在这种方法中,可以null line,从而导致Parse抛出NullreferenceException。(具体来说,因为尝试对null值调用Split。我是否应该检查line是否null以防止引发异常?

防止空参数导致“空引用异常”

你绝对应该防止它被抛出。

您正在设计一个库并公开一个库方法,因此您的使用者不必深入研究您的源代码来了解为什么抛出完全可预防的NullReferenceException

根据该语句后面的代码的作用,您可以提供默认值或抛出ArgumentNullException

line = line ?? "";

或:

if (line == null)
{
    throw new ArgumentNullException("line");
}

您的问题涉及在尝试在方法中取消引用之前,是否建议检查传递给方法的引用类型参数是否null

Microsoft建议您进行此检查。具体而言,如果使用 Visual Studio 中的代码分析工具检查Parse方法,它将发出警告 CA1062:验证公共方法的参数。以下是本文的介绍性文字:

原因

外部可见的方法取消引用其引用之一 参数而不验证该参数是否为 null(没有 Visual Basic)。

规则说明

传递给外部可见方法的所有引用参数 应根据值进行检查。如果合适,抛出一个 参数为空时的参数异常。

如果可以从未知程序集调用方法,因为它是 声明为公共或受保护,应验证 方法。如果该方法设计为仅由已知调用 程序集,您应该使该方法成为内部方法并应用 包含以下内容的程序集的 InternalsVisibleToAttribute 属性 方法。

如何解决违规问题

若要修复与此规则的冲突,请验证每个引用参数 反对

何时禁止显示警告

如果您确定 取消引用的参数已通过 中的另一个方法调用进行验证 函数。

请参阅 CA1062 文章中的第二个代码示例,了解使用私有方法验证参数很有帮助(甚至可能是必不可少的)的方案。