. net代码契约-在哪里学习更多

本文关键字:学习 在哪里 代码 契约 net | 更新日期: 2023-09-27 18:17:34

最近我在办公室听到了一些关于。net " contract "的讨论,但是当我问我的一些同事时,没有人能轻易地向我解释它们是用来做什么的,或者它们到底是什么。

谁有任何资源,解释,也许是一个教程的使用?

谢谢,保罗

. net代码契约-在哪里学习更多

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

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

从微软

:

  • 运行时检查。我们的二进制重写器通过注入契约来修改程序,这些契约作为program>执行的一部分进行检查。重写的程序提高了可测试性:每个合约都像一个预言机,给测试运行一个通过/失败的指示。自动测试工具,例如Pex,通过过滤掉不满足先决条件的无意义测试参数,利用契约来生成更有意义的单元测试。

  • 静态检查。我们的静态检查器甚至可以在不运行程序的情况下决定是否有任何违反合同的行为!它检查隐式契约,如空解引用和数组边界,以及显式契约。

  • 文档生成。我们的文档生成器用合同信息扩充现有的XML文档文件。还有一些新的样式表可以与Sandcastle一起使用,这样生成的文档页面就有了契约部分。

了解更多:

  • 代码契约| Microsoft Research
  • 代码契约概述视频与教程| InfoQ
  • 代码契约| Microsoft DevLabs
  • 使用代码契约教程| jarloo.com

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

为什么这是有用的?

嗯,它阻止你在你认为函数可能返回之后修改变量,从而潜在地引入bug。

下面是一个例子。

public void doSomething(SomeObject foo)
{
    Contract.Requires<ArgumentNullException>(foo != null);
}

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

另一个是Contract.Ensures结构。这基本上类似于Requires,但对返回值进行操作。

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

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

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