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