为什么我要在公共方法中使用代码约定?

Cro*_*ono 5 .net code-contracts

恕我直言,因为任何其他程序员都可以调用带参数的公共方法,它有责任验证参数值并抛出有意义的ArgumentException,如果它们中的任何一个都无效.

话虽如此,为什么我更喜欢这个:

public void Toto(string parameter)
{
    Contract.Requires(parameter != null);
    //...
}
Run Code Online (Sandbox Code Playgroud)

......这个?

public void Toto(string parameter)
{
    if (parameter == null)
        throw new ArgumentNullException(nameof(parameter));
    //...
}
Run Code Online (Sandbox Code Playgroud)

在第一个场景中,必须启用运行时协定检查才能抛出异常.我们知道,对于发布版本,可能不会检查此选项,这意味着不会发生参数验证.对于任何您可能会或可能不知道作为已发布产品的一部分的人使用的公共方法,这似乎是一个坏主意.

即使为发布版本启用了运行时检查,将抛出的异常也不会是典型的.NET开发人员所期望的(ArgumentNullException在本例中).

那我错过了什么?为什么我会使用代码契约而不是"传统的"if-throw模式?

Bob*_*ale 5

您可以使用合同,因为它允许使用您的代码的人使用静态分析器来查找代码中的错误.另外,您可能希望确保实现了Contract.Ensures方法,以便其他程序员知道您的函数保证返回的内容.

您可能会使用替代要求格式作为发布代码.

public void Toto(string parameter)
{
    Contract.Requires<ArgumentNullException>(parameter != null);
    //...
}
Run Code Online (Sandbox Code Playgroud)

因为如果参数为null,这个版本实际上会抛出异常.

  • 但是,这需要为发布版本启用运行时检查,对吧?这不是有缺点吗? (2认同)