.NET 4.0中代码契约的实际用法是什么?

时间:2010-05-27 17:45:01

标签: .net .net-4.0 code-contracts

为了完全理解并利用新.NET Framework 4.0的新功能和增强功能,我想获得一个真实世界应用程序的示例{ {3}}

  1. 任何人都有一个很好的应用此功能的例子吗?
  2. 我想获得一个代码示例,其中包含一个简短的解释,以帮助我启动并运行它。

4 个答案:

答案 0 :(得分:23)

来自The Code Contracts User Manual

  

Contracts允许您在代码中为运行时表达前置条件,后置条件和对象不变量   检查,静态分析和文档。

代码合约用于static verification;想象一下 - 在编译时 - 你不仅捕获了语法错误,还捕获了逻辑错误。这是静态程序验证的愿景。

真实世界示例

您可以使用合同(和静态验证)来降低测试成本......特别是回归测试。举个例子,假设我编写了一些满足某些业务需求的代码......但后来,性能需求发生了变化,我需要进行优化。如果我第一次写合同,那么 - 当我的新优化代码被验证时 - 如果它不再符合原始合同,我将在IDE中收到错误消息,就像我有编译时错误一样。因此,您几乎可以立即找到并解决该错误,其成本低于一轮测试。

答案 1 :(得分:14)

即将出版的书freely available chapter about code contracts中有一个C# in Depth, second edition。有些人叫Jon Skeet,你们中的一些人可能对他很熟悉:)

至于实际用途。您可以在代码中的任何位置使用它们,但特别是如果您正在开发许多人将使用的框架/ API类型库,我希望它们非常方便。与在运行时发现您没有处理某些边缘情况相比,代码的静态验证可以节省批次

您可以随心所欲地记录您的方法用法,但是人们会真正阅读该文档吗?是否允许方法y中的字符串参数x为null,或者不是?代码合同可以提供该信息,从而避免猜测。

以下是这种情况的一个例子:

static int CountWhitespace(string text)
{
    Contract.Requires<ArgumentNullException>(text != null, "text");
    return text.Count(char.IsWhiteSpace);
}

如果有人试图将字符串传递给可能为空的CountWhitespace,则验证会抱怨。此外,它将在运行时抛出ArgumentNullException。

我最近才将我的私有类库转换为.NET 4.0,但我计划很快就将代码合同添加到它。

答案 2 :(得分:8)

很多地方都在.Net中使用合同。 >>Sources<<

答案 3 :(得分:5)

您是否见过NullReferenceException,并希望编译器在编译时能够警告您,以避免找到困难的方法 - 程序崩溃?

使用代码合同,您可以编写如下内容:

Contract.Requires(foo != null);

这不仅仅是运行时检查 - 您可以对其进行设置,以便在使用可能为null的参数调用此函数时,您将收到编译错误。

这是一个真实世界的例子:

Address GetAddress(Customer customer)
{
    Contract.Requires<ArgumentNullException>(customer != null, "customer");
    return addressBook.FindCustomer(customer);
}