我知道检查方法参数的两种方法,并在需要时抛出异常。
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行(包括空行)。
我感兴趣的是有经验的程序员使用的方法。有没有比这两个更好的方法?
答案 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)
这取决于实际需要的内容。
如果您需要为两个空值抛出不同的异常,那么您应该采用第一种方法。
如果两个空案例对于您的代码都是相同的,那么第二种方法可以更好地阅读。
答案 5 :(得分:0)
我个人通常使用检查或验证代码的方法,并在失败时返回false(也许记录/显示错误)。
我想检查所有问题并验证所有问题,所以使用||基本上会在第一次测试时停止。
答案 6 :(得分:0)
两种方法都没问题。基本上抛出ArgumentNullException
是正确的做法。
正如documentation所说的那样
将 null 引用(在Visual Basic中为Nothing)传递给不接受它作为有效参数的方法时引发的异常。