对此的最后一次成熟响应是在 2009 年,.NET 4 已经发布。我想我们该更新了:
对于您的 Debug 版本,代码契约可能已经足够成熟了。
我意识到这在某种程度上是从“无害”到“几乎无害”的升级。
Code Contracts 主页链接到 PDF 格式的完整文档。该文档在第 5 节中概述了使用指南。总而言之,您可以选择您对合约工具在您的发布版本中重写您的 IL 的感觉有多勇敢。
我们正在使用“不要重写我的 Release IL”模式。
到目前为止,我最喜欢这个意想不到的好处:代码更少,因此要测试的代码也更少。你所有的保护条款都消失了。
if(arg != null) {
throw new ArgumentNullException("arg");
}
// Blank line here insisted upon by StyleCop
变成:
Contract.Requires(arg != null);
你的功能更短。你的意图更清楚。而且,您不再需要编写名为 ArgumentShouldNotBeNull 的测试来达到 100% 的覆盖率。
到目前为止,我遇到了两个问题:
我有一个依赖于合同失败的单元测试来成功。您可能会争辩说测试的存在是一个错误,但我想以测试的形式记录这一特殊的禁令。我的构建服务器上的测试失败了,因为我没有安装这些工具。解决方法:安装工具。
我们使用了两种重写 IL 的工具:Code Contracts和PostSharp。他们相处得不太好。PostSharp 的 2.0.8.1283 解决了这个问题。不过,我会谨慎评估任何两种 IL 重写工具如何相处。
到目前为止,利大于弊。
解决其他答案中提出的过时问题:
- Code Contracts 的文档非常详尽,但遗憾的是 PDF 格式。
- 至少有一个由 Microsoft 托管的代码合同论坛。
- 如果您有任何 VS2010 许可证,Code Contracts 标准版是免费的。
- .NET 4 出来了。在实现通用集合接口时,我遇到了微软的合同。