.Net Code Contracts - 在哪里可以了解更多信息?

Pau*_*son 21 .net c# asp.net code-contracts

我最近在我的办公室里听到过关于.Net"合同"的一些讨论,然而,当我问我的一些同事时,他们不能轻易地向我解释他们的用途,甚至是什么.

有没有人有任何资源,解释,也许还有他们使用的教程?

谢谢,

保罗

Rio*_*ams 25

代码契约是在.NET 4.0中引入的,它们提供了一种语言无关的方法来表达程序中的编码假设.

它们基本上允许您检查前置条件,后置条件和其他功能,并且可以极大地改进测试过程以及正在编写的代码的最终质量.

来自微软:  

  • 运行时检查.我们的二进制重写器通过注入契约来修改程序,这些契约作为程序>执行的一部分进行检查.重写的程序提高了可测试性:每个合同都充当了oracle,为测试运行提供了通过/失败指示.自动测试工具(如Pex)利用契约通过过滤掉不符合前置条件的无意义测试参数来生成更有意义的单元测试. 

  • 静态检查.我们的静态检查员可以在没有运行程序的情况下决定是否存在违反合同的行为!它检查隐式契约,例如空引用和数组边界,以及显式契约.

  • 文档生成.我们的文档生成器使用合同信息扩充现有的XML doc文件.还有一些可以与Sandcastle一起使用的新样式表,以便生成的文档页面具有合同部分.

学到更多:


Moo*_*ice 17

代码契约是一种对函数输入和输出进行检查的相对较新的方法.它们与标准Assert类型检查的不同之处在于,检查输入的生成的IL在调用函数之前直接检查它,并在函数实际退出之后检查输出的代码.

为什么这有用?

好吧,它会阻止您在认为函数可能返回后修改变量,从而可能引入错误.

这是一个例子.

public void doSomething(SomeObject foo)
{
    Contract.Requires<ArgumentNullException>(foo != null);
}
Run Code Online (Sandbox Code Playgroud)

现在,代码合同要求在检查之前没有代码.在生成的IL中,foo在调用之前测试值.这是确保您的输入符合预期的可靠方法.

另一个是Contract.Ensures构造.这基本上就像Requires你的回报价值一样.

public int doSomethingElse()
{
    Contract.Ensures(Contract.Result<int>() != 0);
    int ret = 1;
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

如果您的函数有多个退出路径,这将特别有用...

public int someBadFunction()
{
    Contract.Ensures(Contract.Result<int>() != 0);
    if(....)
    {
       if(....) return 2;
       if(....) return 8;
    }
    return 3;
}
Run Code Online (Sandbox Code Playgroud)