代码合同的好处

TOP*_*KEK 16 .net c# optimization

我为什么要使用代码合同

Contract.Requires<ArgumentNullException>( x != null, "x" );
Run Code Online (Sandbox Code Playgroud)

而不是好老

if (x!=null){}
else throw...
Run Code Online (Sandbox Code Playgroud)

除了简洁之外还有其他任何好处吗?

Kon*_*osa 15

根据MSDN:

代码合同的好处包括:

  • 改进的测试:代码合同提供静态合同验证,运行时检查和文档生成.
  • 自动测试工具:您可以使用代码契约通过过滤掉不符合前提条件的无意义测试参数来生成更有意义的单元测试.
  • 静态验证:静态检查程序可以在不运行程序的情况下决定是否存在任何合同违规.它检查隐式契约,例如null解引用和数组边界,以及显式契约.
  • 参考文档:文档生成器使用合同信息扩充现有XML文档文件.还有可以与Sandcastle一起使用的样式表,以便生成的文档页面具有合同部分.

您的里程可能会有所不同,这些点中哪些是重要的.我发现第三和第四(静态验证和文档)特别有趣.

换句话说,它是更加结构化的方式来描述if (x!=null){}其他工具能够理解的合同(而不是类似的结构).


Ham*_*hid 9

除了语法糖之外,Code Contracts是微软用于"按合同设计"范例的工具.http://en.wikipedia.org/wiki/Design_by_contract

在设计类和操作时,它基本上是一种不同的思维方式.根据经验,DbC在测试驱动开发方面非常有效,您在编写任何业务逻辑之前基本上定义了合同并为其编写测试.

在幕后,合同合同在编译时生成类似于旧代码的代码,因此IL代码包含所有检查.

例如,班级

public class Scheduler
{
    public bool ScheduleTask(string taskname, DateTime startTime, DateTime endTime)
    {
        Contract.Requires(!string.IsNullOrWhiteSpace(taskname));
        Contract.Requires(startTime != null);
        Contract.Requires(endTime != null);
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

会产生类似的结果

public bool ScheduleTask(string taskname, DateTime startTime, DateTime endTime)
{
    __ContractsRuntime.Requires(!string.IsNullOrWhiteSpace(taskname), null, "!string.IsNullOrWhiteSpace(taskname)");
    __ContractsRuntime.Requires(true, null, "startTime != null");
    __ContractsRuntime.Requires(true, null, "endTime != null");
    return true;
}
Run Code Online (Sandbox Code Playgroud)

其中_ContractsRuntime.Requests如下所示

internal static void Requires(bool condition, string msg, string conditionTxt)
{
    if (!condition)
    {
        __ContractsRuntime.ReportFailure(ContractFailureKind.Precondition, msg, conditionTxt, null);
    }
}
Run Code Online (Sandbox Code Playgroud)