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

本文关键字:方法 是什么 最佳 参数 检查 | 更新日期: 2023-09-27 18:29:46

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

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行(包括空行)。

我感兴趣的是经验丰富的程序员使用的方法。有比这两种更好的方法吗?

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

更新于2020年7月

看看这篇关于如何实现与代码契约类似的方法的博客文章。

https://enterprisecraftsmanship.com/posts/code-contracts-vs-input-validation/

下方提供的原始答案

---

如果您使用的是.NET framework 4,请查看代码契约,它将代码契约简化为一行代码

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

你之所以会使用它,是因为你现在可以使用像Pex这样的自动化工具来告诉你要将什么单元测试应用于这种方法。如果这个方法会根据你调用它的方式抛出异常,它还会在编译时给你反馈

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

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

注意:代码合约需要一个外接程序才能安装,但它是免费的。

使用方法属性来干净地检查参数。我写了一个在python中验证参数的框架。c#的最佳实践是

在我看来,方法1要有用得多。NullReferenceException s,或者在这种情况下,在无法确定null是什么的情况下抛出ArgumentNullException s是非常令人沮丧的。

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

我知道这是一个旧线程,但我想共享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");

就我个人而言,我通常使用检查或验证代码的方法,当它们失败时返回false(也许还会记录/显示错误)。

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

任何一种方法都可以。基本上,抛出ArgumentNullException是正确的做法。

文件上写着

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

这取决于实际需要什么。

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

  2. 若两个null情况对于代码来说都是一样的,那个么第二种方法会更易读。