.net 4.0代码合同。什么时候用?他们什么时候浪费时间?

时间:2010-06-24 15:18:11

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

我一直在研究.NET 4.0代码契约,并在此问题上查看stackoverflow。

我仍然没有遇到任何使用代码契约的示例代码,这让我感到疑惑......这真的很有用吗?或者也许它唯一有用的一个代码达到一定的复杂性?那里有人使用代码合同,他们真的很高兴吗?

在我看来,所有代码契约都是关于进入的内容和方法的断言,并且能够尝试找出在编译时进出的值...但是然后这将需要更多的代码在你的所有方法..它值得吗?

我注意到的一个好处是,在我看来,你可以使用代码契约作为单元测试的第一行...然后当你编写单元测试时可以避免编写一些更基本的测试,因为代码契约覆盖它已经......是真的吗?

合同是否适用于WCF通话?我猜不会因为您自动创建了代理,但您无法更改。

3 个答案:

答案 0 :(得分:7)

我需要在任何时候使用它们来验证输入参数是否需要具有特定值(数字为正,对象不为空)。

对于输出,我随时都会使用它们,我确定返回值应该处于某种状态(例如,不是null)。

在代码中签订合同可确保在意外值突然出现时抛出异常,而不会因为意外假设而导致对象意外地处于损坏状态的代码中进一步向下抛出异常。

就个人而言,我认为它使代码更清晰。这种表示法使得编写的内容少得多(而不是使用if(.... == null)....)。这种方式也Contract.Requires在它试图完成的事情中处于领先地位。当我看到我知道代码正在评估参数是否处于某种状态时。

答案 1 :(得分:2)

有合同研究领域:http://en.wikipedia.org/wiki/Design_by_contract很久以前它们被引入.net。

代码合同有助于回答以下问题:

  • 方法有什么期望?
  • 方法保证什么?
  • 方法维护什么?

如果您可以为这些问题编写小而易读的合同,请使用它。

答案 2 :(得分:2)

使用CodeContracts的一个主要原因是启用静态分析来检测CodeContracts的违规行为,以便及早捕获它们,而不是在运行时导致错误或未知行为。

如果您愿意,可以禁用CodeContracts的运行时强制执行。

使用它们的另一个好理由是将合同定义添加到XML代码注释以增强API文档。这也适用于Sandcastle,尽管需要进行一些调整才能完全集成它们。请参阅http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf提供的2011年4月4日(或更高版本)的代码合同用户手册中的第8.3节