恕我直言,因为任何其他程序员都可以调用带有参数的公共方法,所以它有责任验证参数值并抛出有意义的ArgumentException
,如果它们中的任何一个都无效。
话虽如此,为什么我更喜欢这个:
public void Toto(string parameter)
{
Contract.Requires(parameter != null);
//...
}
...在这?
public void Toto(string parameter)
{
if (parameter == null)
throw new ArgumentNullException(nameof(parameter));
//...
}
在第一个场景中,必须启用运行时协定检查才能抛出异常。我们知道,对于发布版本,可能不会检查此选项,这意味着不会发生参数验证。对于任何您可能会或可能不知道作为已发布产品的一部分的人使用的公共方法,这似乎是一个坏主意。
即使为发布版本启用了运行时检查,将抛出的异常也不会是典型的.NET开发人员所期望的(在这种情况下为ArgumentNullException
)。
那我错过了什么?为什么我会使用代码契约而不是“传统的”if-throw模式?
答案 0 :(得分:5)
您可以使用合同,因为它允许使用您的代码的人使用静态分析器在代码中查找错误。另外,您可能希望确保实现了Contract.Ensures方法,以便其他程序员知道您的函数保证返回的内容。
您可能会使用替代要求格式作为发布代码。
public void Toto(string parameter)
{
Contract.Requires<ArgumentNullException>(parameter != null);
//...
}
如果参数为null,这个版本实际上会抛出异常。