C# 防止null参数导致“NullReferenceException”

C# 防止null参数导致“NullReferenceException”,c#,.net,exception-handling,null,nullreferenceexception,C#,.net,Exception Handling,Null,Nullreferenceexception,在我的库中,我经常公开以字符串作为参数的方法。我是否应该始终检查字符串参数是否等于null?或者忽略会导致NullreferenceException的空值的可能性可以吗 例如: public static void Parse(string line) { string[] splits = line.Split(' '); } 在这个方法中,行可以为null,这将导致Parse抛出NullreferenceException。特别是,因为有人试图对空值调用Split。我是否应该检

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

例如:

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

在这个方法中,行可以为null,这将导致Parse抛出NullreferenceException。特别是,因为有人试图对空值调用Split。我是否应该检查行是否为null以防止抛出异常?

您肯定应该防止抛出异常

您正在设计一个库并公开一个库方法,因此您的使用者不必深入到您的源代码中去了解为什么会引发完全可预防的NullReferenceException

根据该语句后面的代码所做的操作,您可以提供默认值或引发ArgumentNullException:

或:


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

Microsoft建议您进行此检查。具体地说,如果您使用VisualStudio中的工具检查解析方法,它将发出警告。以下是本文的介绍性文本:

原因 一个外部可见的方法取消引用它的一个引用 参数,而不验证该参数是否为空,在Nothing中为空 Visual Basic

规则描述 传递给外部可见方法的所有引用参数 应检查是否为null。如果合适,抛出一个 当参数为null时

如果由于未知程序集无法调用某个方法,则 声明为public或protected时,应验证 方法。如果该方法设计为仅由已知 程序集时,应将该方法设置为内部并应用 属性添加到包含 方法

如何纠正违规行为 若要修复违反此规则的情况,请验证每个引用参数 反对无效

何时取消显示警告 如果您确定 取消引用的参数已由中的另一个方法调用验证 功能


有关使用私有方法验证参数的场景,请参见CA1062文章中的第二个代码示例。在该场景中,使用私有方法验证参数非常有用,甚至可能是必不可少的。

。。对为什么不呢?从更务实的角度来看,是的。NullReferenceException几乎总是在抛出错误的地方指示错误。如果我调用Parse并抛出NullReferenceException,我会假设Parse方法中存在错误。然而,如果它抛出了一个异常,我就会知道这个bug是我的。请参阅,以获取相关论点。为了回应投票以基于意见的方式结束此问题,我最好将问题标题与问题提出的特定场景对齐,并投票重新开始此问题。如中所示,Microsoft针对这个问题所造成的情况提供了具体的指导。因此,由于此问题的答案有权威引用支持,因此不应以基于意见的方式关闭。使用空参数调用解析方法是一个错误。永远不要隐藏虫子??我想是吧?我完全同意,尽管在某些情况下,在输入为null时提供默认值是有意义的。如果它是一个单参数分析方法,并且该参数为null,则它确实不存在。@CodeCaster:不同意库方法不引发异常。这正是库方法应该做的。考虑XMLSerialTube在检测非法XML时如何与您通信。或者ADO.NET如何与您通信。或者说几乎每个第三方图书馆都是如何与你沟通的。正确的语句应该是,当遇到无效条件(例如null参数、缺少参数等)时,库方法应该抛出异常。@code4life问题是关于NullReferenceException的。任何图书馆都不应该扔掉这些东西。
line = line ?? "";
if (line == null)
{
    throw new ArgumentNullException("line");
}