检查方法参数的最佳方法是什么
本文关键字:方法 是什么 最佳 参数 检查 | 更新日期: 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)传递给不接受其为有效参数的方法时引发的异常
这取决于实际需要什么。
-
若需要为两个null值抛出不同的异常,那个么应该采用第一种方法。
-
若两个null情况对于代码来说都是一样的,那个么第二种方法会更易读。