检查方法参数的最佳方法是什么?

时间:2012-03-31 09:00:35

标签: c# validation parameters

我知道检查方法参数的两种方法,并在需要时抛出异常。

1)检查每个参数并在错误时抛出异常:

public void Method(object parameter1, object parameter2)
{
    if (parameter1 == null)
    {
        throw new ArgumentNullException("parameter1");
    }

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

    ...
}

2)立即检查所有参数并为所有参数抛出相同的异常:

public void Method(object parameter1, object parameter2)
{
    if (parameter1 == null || parameter2 == null)
    {
        throw new ArgumentNullException();
    }

    ...
}

在我看来,第一种方法更好,更清洁,但也涵盖了很多方面。例如,实际执行2行代码的方法 - 这样代码将为每个参数增加4行(包括空行)。

我感兴趣的是有经验的程序员使用的方法。有没有比这两个更好的方法?

7 个答案:

答案 0 :(得分:21)

如果您使用的是.NET framework 4,请查看Code Contracts,将其简化为一行代码

public string Reverse(string text)
{
   Contract.Requires<ArgumentNullException>(text!=null, "ParAmeter cannot be null.");

   .....
}

您使用此功能的原因是您现在可以使用Pex之类的自动工具来告诉您应用于此方法的单元测试。如果此方法根据您的调用方式抛出异常,它还会在编译时为您提供反馈。像

String text = null;
String reversedString = Reverse(text);

编译器会警告您这将引发异常。

注意代码合同需要安装加载项,但它是免费的。

答案 1 :(得分:5)

使用method属性干净地检查参数。 我在python中编写了一个参数验证框架.c#最佳实践是here

答案 2 :(得分:4)

方法1在我看来更有用。 NullReferenceException s,或者在这种情况下ArgumentNullException被抛出,你无法确定null是什么令人沮丧。

此外,如果您不喜欢查看验证代码,您可以始终将其包装在代码区域中并将其折叠在IDE中。

答案 3 :(得分:3)

我知道这是一个老话题,但我想分享MHO。这就是我通常做的事情:

创建一个通用方法:

private void ValidateArgument<exType>(Func<bool> validation, string errorMessage) where exType : Exception
        {
            if (validation())
            {
                throw Activator.CreateInstance(typeof(exType), errorMessage) as exType;
            }
        }

然后从您执行的调用方法:

this.ValidateArgument<ArgumentException>(() => string.IsNullOrEmpty(firstname), "firstname must be supplied");

答案 4 :(得分:0)

这取决于实际需要的内容。

  1. 如果您需要为两个空值抛出不同的异常,那么您应该采用第一种方法。

  2. 如果两个空案例对于您的代码都是相同的,那么第二种方法可以更好地阅读。

答案 5 :(得分:0)

我个人通常使用检查或验证代码的方法,并在失败时返回false(也许记录/显示错误)。

我想检查所有问题并验证所有问题,所以使用||基本上会在第一次测试时停止。

答案 6 :(得分:0)

两种方法都没问题。基本上抛出ArgumentNullException是正确的做法。

正如documentation所说的那样

null 引用(在Visual Basic中为Nothing)传递给不接受它作为有效参数的方法时引发的异常。