9

我一直在研究 .NET 4.0 Code Contracts 并查看 stackoverflow 以及关于此的问题。

我仍然从未遇到任何使用代码合同的示例代码,这让我想知道.. 这真的有用吗?或者也许它唯一有用的一个你的代码达到了一定的复杂性?有人在使用代码合同并且真的很高兴他们这样做了吗?

在我看来,所有代码合同都是关于方法的输入和输出的断言,此外还能够尝试找出在编译时输入和输出的值......但接下来就是这样在所有方法上都需要更多代码..值得吗?

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

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

4

3 回答 3

7

每当我需要验证输入参数是否需要具有特定值(数字为正,对象不为空)时,我都会使用它们。

对于输出,只要我确定返回值应该处于某种状态(例如,不为空),我就会使用它们。

在代码中包含契约可确保在出现意外值的那一刻抛出异常,而不是在代码的更深处,因为意外假设,对象可能会意外地处于损坏状态。

就个人而言,我认为它使代码更清晰。该符号减少了编写(而不是使用 if(....== null)....)。这种方式Contract.Requires在它试图完成的事情上也非常领先。当我看到我知道代码正在评估参数处于某种状态时。

于 2010-06-24T15:19:47.383 回答
2

有关于合同的研究领域:http ://en.wikipedia.org/wiki/Design_by_contract在.net 中引入它们之前很久。

代码契约有助于回答以下问题:

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

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

于 2010-06-24T15:23:16.440 回答
2

使用CodeContracts的主要原因之一是启用静态分析以检测违反 CodeContracts 的情况,以便及早发现它们,而不是在运行时导致错误或未知行为。

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

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

于 2011-10-13T17:41:07.937 回答