例如本文介绍了它们。
有什么好处?
静态分析看起来很酷,但同时它会阻止在单元测试中将 null 作为参数传递的能力。(如果您按照文章中的示例进行操作)
在单元测试的话题上——考虑到现在的情况,如果你已经练习过自动化测试,那么代码合同肯定没有意义吗?
更新
玩过 Code Contracts 我有点失望。例如,根据接受答案中的代码:
public double CalculateTotal(Order order)
{
Contract.Requires(order != null);
Contract.Ensures(Contract.Result<double>() >= 0);
return 2.0;
}
对于单元测试,你还是要写测试保证null不能通过,如果合约是业务逻辑,结果大于等于0 。换句话说,如果我要删除第一个合同,任何测试都不会中断,除非我专门对此功能进行了测试。然而,这是基于不使用更好(终极等)版本的 Visual Studio 中内置的静态分析。
从本质上讲,它们都归结为编写传统 if 语句的另一种方式。我实际使用TDD 和 Code Contracts的经验说明了为什么,以及我是如何去做的。