为了完全理解并利用新.NET Framework 4.0的新功能和增强功能,我想获得一个真实世界应用程序的示例{ {3}}
我想获得一个代码示例,其中包含一个简短的解释,以帮助我启动并运行它。
答案 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);
}